2014-02-08 50 views
16

有很多与此相关的问题,但没有一个能够帮助我获得解决方案。如何在地址簿中插入/更新/删除联系人

我试图将设备中的所有联系人同步到远程服务器,并且能够轻松完成,但是当更新/删除/插入(新联系人)等联系人发生更改时无法找到解决方案。

尝试使用ContentObserveronChange()被多次调用。很难找到联系人更改数据。

public class ContactService extends Service { 

    private int mContactCount; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mContactCount = getContactCount(); 

     Log.d("Contact Service", mContactCount + ""); 

     this.getContentResolver().registerContentObserver(
       ContactsContract.Contacts.CONTENT_URI, true, mObserver); 
    } 

    private int getContactCount() { 
     Cursor cursor = null; 
     try { 
      cursor = getContentResolver().query(
        ContactsContract.Contacts.CONTENT_URI, null, null, null, 
        null); 
      if (cursor != null) { 
       return cursor.getCount(); 
      } else { 
       return 0; 
      } 
     } catch (Exception ignore) { 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 
     } 
     return 0; 
    } 

    private ContentObserver mObserver = new ContentObserver(new Handler()) { 

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

      final int currentCount = getContactCount(); 
      if (currentCount < mContactCount) { 
       // CONTACT DELETED. 

       Log.d("Contact Service", currentCount + ""); 

      } else if (currentCount == mContactCount) { 
       // CONTACT UPDATED. 
      og.d("Contact Service", currentCount+""); 

      } else { 
       // NEW CONTACT. 
       Log.d("Contact Service", currentCount + ""); 

      } 
      mContactCount = currentCount; 
     } 

    }; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     getContentResolver().unregisterContentObserver(mObserver); 
    } 
} 

但是onChange()当有更新/插入地址簿时多次调用。

任何人都可以提供给我更好的解决方案吗?

它将不胜感激。

感谢

+0

得到了这里的解决方案 - http://stackoverflow.com/a/31970349/1881611 – IshRoid

回答

18

事情有关onChange的是,它被调用既为删除/添加/更新,所以你不能仅计算联系人的数量,因为人们可能会被删除并加一那么你有一个改变通讯录,但数量相同。不过,查看column版本,您应该能够评估哪个联系人已更新(无论您已经获得联系簿的完整副本)。只需检查版本是否大于您已有的版本(针对当前联系人)。

+0

有没有办法阻止onChange只有在有联系人的插入/更新/删除时才会被叫一次? – moDev

+0

您可以通过在特定的时间段内只接受一次呼叫来自己扼制onchange呼叫(过滤呼叫),也可以接收所有呼叫,但决定每五秒钟将onchange发送到您自己的代码。 – Magnus

+0

有没有什么办法根据他们的状态获取联系人,如新联系人,更新联系人或删除联系人? – moDev

-2

我这样做,它为我的呼叫日志和联系人号码更改。

in onChange 

execute a Query with contentResolver(), and put the data in a List 
then something is deleted again execute 
a Query with contentResolver(), and assign it to tempList. 
now compare the List and tempList 



@Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange);  
     final int List = totalContacts(); 

if (tempList < List) { 
something is deleted 
then remove the tempList from List you will get the deleted number 

}else if (tempList == List) { 
something is updated 
then remove the tempList from List you will get the deleted number 
}else { 
     something is added(reverse the Lists) 
then remove the List from tempList you will get the deleted number 
    } 
} 
+1

对不起,downvote,但这不仅是一个非常低效的查找delta的方式,也是写得不好,格式不对伪代码。 – mradzinski

0

按照Magnus的答案,使用此列来检索版本代码

ContactsContract.RawContacts.VERSION

相关问题