5

我正在開發一個應用程序,其中我正在使用Android通訊錄並且無法繼續前進。在應用程序中,應用程序的需要是更新的聯繫人應發送到服務器或刪除的聯繫人應發送到服務器進行同步。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到三秒鐘做非常幾秒鐘......

編輯: 在下面的模塊在上面的代碼:

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

我把日誌。所以更新模組被稱爲很多次,而且還當我做添加或刪除的時間太...

請指引我,並建議我做什麼,以減少上述任務的時間...

回答

2

使用以下查詢獲取所有已刪除和更新的聯繫人。

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); 
+0

謝謝你的回答。但上面的答案給我我的應用程序帳戶聯繫人刪除或更新。我需要刪除或更新所有聯繫人。 –

+0

如果您對所有帳戶感興趣,只需從其中刪除帳戶類型條件 – RocketRandom

+0

我也試過,但獲得很多已刪除和更新的數字。需要的只是最新的更新或刪除的號碼。 –