уведомление моего приложения, когда контакт добавлен / удален / отредактирован через contentobserver - PullRequest
0 голосов
/ 24 декабря 2018

Я создаю приложение для Android, и в моем приложении есть модуль, занимающийся синхронизацией контактов, в котором я синхронизирую контакты с контактом пользователя.

Список со списком контактов на сервере для фильтрации пользователей, зарегистрированных в приложении., аналогично Whatsapp, telegram, Facebook.

Теперь моя главная проблема - как выполнить синхронизацию контактов, в настоящее время я использую адаптер синхронизации, в котором я получаю все контакты из списка контактов пользователя и отправляю их на сервер.выполнить синхронизацию , но этот метод медленный и использует много телефонных ресурсов ,

Так что я выбираю лучший метод, если вам известна какая-либо помощь, пожалуйста, обратитесь ко мне.

При этом я сталкиваюсь с обозревателем контента, который в некотором роде работает немного лучше. Он уведомляет меня, когда контакт добавляется или редактируется, но не может правильно уведомить об удалении контакта, использую

ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,

Во-вторых, он только уведомляет, когда приложение запущено, а не когда оно убито, какВ фоновом режиме, а также, если это возможно, как я могу интегрировать его в адаптер синхронизации для периодической проверки или имеется адаптер синхронизации, предназначенный для выполнения этой синхронизации контактов.любая помощь в поиске подходящего средства для синхронизации контактов будет оценена

вот мой код

public class ContentObserver extends android.database.ContentObserver
{

private Context mContext;
private static final String TAG="Contenr_observer_tag";

public ContentObserver(Handler handler,Context context) {
    super(handler);
    this.mContext=context;
    Log.d(TAG,"occures here");
}

@Override
public void onChange(boolean selfChange) {
    this.onChange(selfChange);
}

@Override
public void onChange(boolean selfChange, Uri uri) {



    Cursor cursor=mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,
            null,ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP+" DESC");
    if (cursor.moveToNext()){
        String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        Log.d(TAG,"contact id: "+id);
        Log.d(TAG,"contact name "+name);

    }
    cursor.close();
}

}

1 Ответ

0 голосов
/ 24 декабря 2018

Итак, подтвердив, что вам нужно только проверить номер телефона всех контактов, я предполагаю, что вы пробовали что-то вроде этого:

Cursor c1 = cr.query(Contacts.CONTENT_URI,null,null,null,null);
while (c1.moveToNext()) {
   long contactId = cur.getLong(...);
   Cursor c2 = cr.query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=" + contactId, null, null);
   String phone = c2.getString(...); 
   // add phone to some list or map
}
sendAllPhonesToServer();

Это действительно медленно, так как требует много запросов - как числоконтактов устройства, но вы можете сделать это лучше.

Map<Long, String> phonesMap = new HashMap<>(); // mapping from contactId to phone
String[] projection = new String[] { Phone.CONTACT_ID, Phone.NORMALIZED_NUMBER }; // if you need to support API 15 and below, change to Phone.NUMBER
Cursor c = cr.query(Phone.CONTENT_URI,projection,null,null,null);
while (c.moveToNext()) {
   long contactId = c.getLong(0);
   String phone = c.getString(1);
   phonesMap.put(contactId, phone); 
}
sendAllPhonesToServer(phonesMap);

Это должно быть довольно быстро и легко реализовать, вставьте его в SyncAdapter и периодически запускайте его под Android (не требует вашегоприложение запущено для запуска SyncAdapter)

...