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

Java 通过contentobserver添加/删除/编辑联系人时通知我的应用程序,java,android,android-contacts,contactscontract,Java,Android,Android Contacts,Contactscontract,我正在创建一个android应用程序,在我的应用程序中有一个处理联系人同步的模块,在该模块中,我从用户联系人同步联系人 使用服务器联系人列表筛选在应用程序中注册的用户,类似于Whatsapp、telegram、Facebook 现在我的主要问题是如何执行联系人同步,目前我正在使用一个同步适配器,从用户联系人列表中获取所有联系人并将其发送到服务器以执行同步,但这种方法速度慢,占用了大量电话资源 因此,我选择了一个更好的方法,如果你知道任何类型的帮助,请参考我 也就是说,我遇到了content ob

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

使用服务器联系人列表筛选在应用程序中注册的用户,类似于Whatsapp、telegram、Facebook

现在我的主要问题是如何执行联系人同步,目前我正在使用一个同步适配器,从用户联系人列表中获取所有联系人并将其发送到服务器以执行同步,但这种方法速度慢,占用了大量电话资源

因此,我选择了一个更好的方法,如果你知道任何类型的帮助,请参考我

也就是说,我遇到了content observer,它在某种程度上工作得更好。它会在添加或编辑联系人时通知我,但在删除联系人时无法正确通知我,我正在使用

联系人contract.Contacts.CONTACT\u LAST\u UPDATED\u时间戳

其次,它只会通知应用程序何时运行,而不是何时终止,如何在后台运行,以及如果可能,我如何将其集成到同步适配器中以定期检查,或者是否有同步适配器方法来执行此联系人同步。如果您能找到同步联系人的合适方法,我们将不胜感激

这是我的代码

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();
}

}

因此,在确认您只需检查所有联系人的电话号码后,我假设您已经尝试过以下方法:

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);
Map phonesMap=new HashMap();//从contactId映射到手机
字符串[]投影=新字符串[]{Phone.CONTACT_ID,Phone.NORMALIZED_NUMBER};//如果您需要支持API 15及以下版本,请更改为Phone.NUMBER
游标c=cr.query(Phone.CONTENT\u URI,projection,null,null,null);
while(c.moveToNext()){
long contactId=c.getLong(0);
字符串phone=c.getString(1);
phonesMap.put(联系人ID、电话);
}
sendAllPhonesToServer(phonesMap);

这应该很快,也很容易实现,把它放在你的SyncAdapter中,让Android定期运行它(运行SyncAdapter不需要你的应用程序)

你是如何尝试前面的方法的,还是检查了所有没有内容观察者的联系人?如果运行正确的查询,您可以快速地完成这项工作。此外,您是否正在检查用户是否仅使用电话号码注册到您的应用程序(如whatsapp)?请发送内容obsever query当前查询am使用的是:Cursor Cursor=cR.query(Contacts contract.Contacts.content\u URI,null,null,null,null);是的,我是cheking,用户注册的方式和whatsapp一样