Android:仅获取更新和删除的联系人

Posted

技术标签:

【中文标题】Android:仅获取更新和删除的联系人【英文标题】:Android: Get updated and deleted contact only 【发布时间】:2016-05-12 11:04:33 【问题描述】:

我正在开发一个应用程序,在该应用程序中我正在处理 android 联系人但无法继续前进。在应用程序中,应用程序的需要是更新的联系人应该发送到服务器或删除的联系人应该发送到服务器进行同步。

我正在使用联系服务:

public class ContactService extends Service 
    private int mContactCount;
    Cursor cursor = null;
    static ContentResolver mContentResolver = null;

    // Content provider authority
    public static final String AUTHORITY = "com.android.contacts";
    // Account typek
    public static final String ACCOUNT_TYPE = "com.example.myapp.account";
    // Account
    public static final String ACCOUNT = "myApp";

    // Instance fields
    Account mAccount;
    Bundle settingsBundle;

    @Override
    public void onCreate() 
        super.onCreate();
        // Get contact count at start of service
        mContactCount = getContactCount();      
    

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
        // Get contact count at start of service
        this.getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, mObserver);
        return Service.START_STICKY;
    

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

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

    private ContentObserver mObserver = new ContentObserver(new Handler()) 
        @Override
        public void onChange(boolean selfChange) 
             this.onChange(selfChange, null);
        

        @Override
        public void onChange(boolean selfChange, Uri uri) 
            new changeInContact().execute();
        
    ;

    public class changeInContact extends AsyncTask<String, Void, String> 
        @Override
        protected void onPreExecute() 
            super.onPreExecute();
        

        @Override
        protected String doInBackground(String... arg0) 
            ArrayList<Integer> arrayListContactID = new ArrayList<Integer>();

            int currentCount = getContactCount();

            if (currentCount > mContactCount) 
                // Contact Added
             else if (currentCount < mContactCount) 
                // Delete Contact               
             else if (currentCount == mContactCount)              
                // Update Contact
            
            mContactCount = currentCount;
            return "";
        

        @Override
        protected void onPostExecute(String result) 
            contactService = false;
         // End of post
    

我面临的问题如下:

答:在上面获取最近更新的联系人的代码中,我需要检查设备中每个联系人的版本 与我的数据库存储版本 联系人。大量联系需要花费大量时间。

B. 为了删除联系人,我需要检查 存储在我的数据库中的原始 ID数据 是否存在于设备中或不是。如果不是,则删除该联系人。检查整个联系人也需要太多时间。

但是同样的事情联系人刷新是在几秒钟内完成的,比如 2 到 3 秒...

编辑: 在以下模块中的上述代码中:

if (currentCount > mContactCount) 
    // Contact Added
    Log.d("In","Add");
 else if (currentCount < mContactCount) 
    // Delete Contact               
    Log.d("In","Delete");
 else if (currentCount == mContactCount)              
    // Update Contact
    Log.d("In","Update");

我放了日志。所以更新模块被调用了很多次,当我添加或删除那个时候也是......

请指导我并建议我如何减少上述任务的时间......

【问题讨论】:

【参考方案1】:

使用以下查询获取所有已删除和更新的联系人。

public static final String ACCOUNT_TYPE = "com.android.account.youraccounttype"
public static final String WHERE_MODIFIED = "( "+RawContacts.DELETED + "=1 OR "+
            RawContacts.DIRTY + "=1 ) AND "+RawContacts.ACCOUNT_TYPE+" = '"+ ACCOUNT_TYPE+"'";

c = contentResolver.query(ContactsContract.RawContacts.CONTENT_URI,
                    null,
                    WHERE_MODIFIED,
                    null,
                    null);

【讨论】:

感谢您的回答。但是上面的答案给了我我的应用程序帐户联系人已删除或更新。我需要所有已删除或更新的联系人。 如果您对所有帐户感兴趣,只需从 where 中删除帐户类型条件 我也试过了,但是收到了很多删除和更新的号码。需要的只是最新更新或删除的号码。 查询将返回所有更新和删除的,直到它们被所属帐户类型标记为同步。如果您反复获得相同的号码,则所属帐户类型的联系人同步有问题。 也许您可以详细说明您用于测试的帐户。它们是标准帐户(如 google、exchange 还是由可能不太可靠的自定义应用程序添加的帐户)。总体而言,RawContacts.DIRTY 是将联系人标记为已更新的标准方式。

以上是关于Android:仅获取更新和删除的联系人的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android 设备中仅获取电话号码联系人

检测android联系人是不是已被删除

在 Android 中,如何仅选择 PHONE 联系人?

获取具有类型过滤功能的 Android 联系人,仅限于特定帐户

Android:插入/更新/删除联系人

Android 手机联系人仅包含照片、电话和姓名