2016-11-03 29 views
4

我正在使用内容观察员知道有联系人的设备的电话簿发生了变化,但我没有完成确切的任务像wheather联系人已添加删除或更新,更新/添加联系人的价值是什么。在android如何知道该联系人被删除/更新/添加和哪个联系人已新添加

//服务在后台运行,它总是运行和检查,知道的内容已被更改

public class ContactChange extends Service { 


    ContactObserver observer; 

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

    @Override 
    public void onCreate() { 
     observer = new ContactObserver(new Handler(),getApplicationContext()); 
     // TODO Auto-generated method stub 
     getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, observer); 

     super.onCreate(); 
    } 

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



//Content observer where we get to know that changes has made to the contact phonebook 

    public class ContactObserver extends ContentObserver { 

    private Context mContext; 
    DataBaseCurdOperation dataBaseCurdOperation; 
    ApiInterface apiInterface; 
    MyPrefs myPrefs; 
    ArrayList<InviteList> inviteArrayList; 

    public ContactObserver(Handler handler, Context context) { 
     super(handler); 
     this.mContext = context; 
     dataBaseCurdOperation = new DataBaseCurdOperation(mContext); 
     myPrefs = new MyPrefs(mContext); 
     apiInterface = ServiceGenerator.createService(ApiInterface.class, Config.BASE_URL_1); 
     inviteArrayList = new ArrayList<InviteList>(); 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     this.onChange(selfChange, null); 
    } 




    @Override 
    public void onChange(boolean selfChange, Uri uri) { 
     Logger.LogError("URI", uri.toString()); 
     boolean hasContactPermission = (ContextCompat.checkSelfPermission(mContext, 
       android.Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED); 
     if (hasContactPermission) { 
      SavingContactsActivity savingContactsActivity = new SavingContactsActivity(mContext); 
      savingContactsActivity.execute(); 
      new InviteApiCall().execute(); 
     } 
    } 
+0

工作的数据库上使用CON熟悉的观察者,只有在发生任何变化时才会收到通知。它不会给你任何有关更改添加/删除/更新或数据的性质的信息? – umerk44

+0

是的,这是我的问题我们怎么才能知道哪些数据已经改变? – user3475052

+0

您可以将联系人列表的最后修改副本保留在数据库中,并且每当发生更改时,都可以将新联系人列表与最后修改的联系人列表进行比较。不是非常优化的解决方案,但您可以通过这种方式跟踪更改。 – umerk44

回答

1

采取这种方法,它是给接触它是否被添加或更新不是得到了解决已删除但肯定会很快发布删除.... 的答案,我以后

public class ContactSyncObserver extends ContentObserver { 

Context mContext; 
DataBaseCurdOperation dataBaseCurdOperation; 
MyPrefs myPrefs; 


public ContactSyncObserver(Handler handler, Context mContext) { 
    super(handler); 
    this.mContext = mContext; 
    dataBaseCurdOperation = new DataBaseCurdOperation(mContext); 
    myPrefs = new MyPrefs(mContext); 

} 

@Override 
public boolean deliverSelfNotifications() { 
    return true; 
} 

@Override 
public void onChange(boolean selfChange, Uri uri) { 
    super.onChange(selfChange, uri); 
    boolean hasContactPermission = (ContextCompat.checkSelfPermission(mContext, 
      Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED); 
    if (hasContactPermission) { 
     try { 
      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)); 
       Logger.LogError("contactId", myPrefs.getContactId()); 
       String name = cursor.getString(
         cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       String rawContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.NAME_RAW_CONTACT_ID)); 
       String phoneNumber = null; 
       String hasPhoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
       if (Integer.parseInt(hasPhoneNumber) > 0) { 
        Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null); 
        while (phones.moveToNext()) { 
         phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         Log.e("Number", phoneNumber); 
        } 
        phones.close(); 
       } 
       if (phoneNumber != null) { 
        phoneNumber = phoneNumber.replaceAll(" ", ""); 
       } 
       if (dataBaseCurdOperation.checkIsContactIdExist(id)) { 
        if (!myPrefs.getContactId().equals(id)) { 
         dataBaseCurdOperation.updateNewNumber(id, phoneNumber, name, "updated"); 
         UtilHandler.TriggerRefresh(); 
        } else { 
         Handler handler = new Handler(); 
         handler.postDelayed(new Runnable() { 
          @Override 
          public void run() { 
           myPrefs.setContactId("0"); 
          } 
         }, 3000); 
        } 
       } else { 
        dataBaseCurdOperation.insertServerContact(id, name, phoneNumber, "inserted", "newNumber", "newName"); 
        UtilHandler.TriggerRefresh(); // triggering my sync adapter here... 
       } 
       myPrefs.setContactId(id); 
      } 
     } catch (Exception e) { 
      Logger.LogError("Contact Exception", "occured"); 
     } 
    } 
} 

}

相关问题