通过contentobserver添加/删除/编辑联系人时通知我的应用

时间:2018-12-24 08:09:54

标签: java android android-contacts contactscontract

我正在创建一个android应用程序,并且在我的应用程序中有一个用于处理联系人同步的模块,其中我从用户联系人中同步联系人。

带有服务器联系人列表的列表,以过滤在该应用程序中注册的用户,类似于Whatsapp,电报,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 :(得分:0)

所以确认您只需要检查所有联系人的电话号码后,我假设您已经尝试过以下操作:

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)