0

이 방법을 사용하여 ContentObserver를 구현했습니다. 연락처에 변경 사항이있을 경우에만 알림을받을 수 있습니다.Android 연락처 목록을 감지하는 방법이 변경 되었습니까?

연락처가 추가되었거나 삭제되었거나 업데이트 된 것을 모르십니까 ??

! 어떤 제안? 어떤 연락처가 수정되었는지 어떻게 알 수 있습니까?

다음 방법을 사용하여 모든 연락처 목록을 가져오고 있습니다.

public void readContacts() { 

    System.out.println(" reading contact "); 
    String phoneNumber = null; 
    Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI; 
    String _ID = ContactsContract.Contacts._ID; 
    String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; 
    String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; 

    Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; 
    String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; 

    StringBuffer output = new StringBuffer(); 
    ContentResolver contentResolver = getContentResolver(); 

    Cursor cursor = contentResolver.query(CONTENT_URI, null, null, null, 
      null); 

    if (cursor.getCount() > 0) { 
     while (cursor.moveToNext()) { 
      String contact_id = cursor 
        .getString(cursor.getColumnIndex(_ID)); 
      String name = cursor.getString(cursor 
        .getColumnIndex(DISPLAY_NAME)); 
      // int id = 
      // Integer.parseInt(cursor.getString(cursor.getColumnIndex(
      // HAS_PHONE_NUMBER))); 
      int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor 
        .getColumnIndex(HAS_PHONE_NUMBER))); 
      if (hasPhoneNumber > 0) { 
       output.append("\n First Name:" + name); 

       System.out.println(" CONTACT NAME : " + name); 
       Contact_Name.add(name); 

       // Query and loop for every phone number of the contact 
       Cursor phoneCursor = contentResolver.query(
         PhoneCONTENT_URI, null, Phone_CONTACT_ID + " = ?", 
         new String[] { contact_id }, null); 

       phoneCursor.moveToNext(); 

       phoneNumber = phoneCursor.getString(phoneCursor 
         .getColumnIndex(NUMBER)); 
       output.append("\n Phone number:" + phoneNumber); 
       System.out.println(" CONTACT number : " + phoneNumber); 

       phoneNumber = phoneNumber.replaceAll("\\s", ""); 
       // phoneNumber = phoneNumber.substring(phoneNumber.length() 
       // - 10); 
       // System.err.println("Mobile no."+phoneNumber); 
       Contact_Number.add(phoneNumber); 

       phoneCursor.close(); 
      } 
      output.append("\n"); 
     } 
    } 

} 

나는 연락처 목록이 regestring 및 다음 코드를 사용하여 일부 변경된 것을 관찰하고 있습니다.

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

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

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

     final int currentCount = getContactCount(); 
     if (currentCount < mContactCount) { 
      System.out.println(" Deleted contact"); 
     } else if (currentCount == mContactCount) { 
      System.out.println(" upated contact"); 
     } else { 
      System.out.println(" inserted contact"); 
     } 
     mContactCount = currentCount; 

    } 

}; 
+0

이유는 무엇'registerContentObserver' 후'mObserver'의 선언? – Manu

+0

@Manu 나는 이것을 내 코드에서 완벽하게 선언했다. 여기에 registerContentObserver를 입력하면 –

답변

2

버전이 이미 (현재 연락처의) 버전보다 큰지 확인하십시오. 모든 항목 (삭제, , 추가 또는 업데이트)에 대해 OnChange이 호출되었으므로이 프로세스가 빠르고 정확하게 처리됩니다.

그래서 연락처 수가 업데이트 된 다음 삭제되고 새 연락처가 추가 되었기 때문에 연락처의 수를 세는 것은 의미가 없습니다. 이 경우 카운트는 동일합니다.

http://developer.android.com/reference/android/provider/ContactsContract.SyncColumns.html#VERSION

0

시도는 연락처 배열이 구현을 사용하는

당신의 활동 또는 어댑터

protected ActiveList.ActiveListListener<Contact> activeListListener = new ActiveList.ActiveListListener<Contact>() { 
     @Override 
     public void onAdd(Contact c) { 
      // do something 
     } 

     @Override 
     public void onInsert(final int location, final Contact c) { 
      // do something 
     } 

     @Override 
     public void onClear() { 
      // do something 
     } 

     @Override 
     public void onAddAll(List<Contact> cs) { 
      // do something 
     } 
    }; 

에서 당신의 배열에

import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class ActiveList<T> extends ArrayList<T> implements Serializable { private static final long serialVersionUID = 870605912858223939L; transient private List<ActiveListListener<T>> listeners; public interface ActiveListListener<T> { void onAdd(T item); void onInsert(int location, T item); void onAddAll(Collection<? extends T> items); void onClear(); } @Override public synchronized void clear() { super.clear(); fireChangedEvent(); } @Override public synchronized int size() { return super.size(); } @Override public synchronized T get(int index) { return super.get(index); } @Override public synchronized boolean add(T item) { boolean success = super.add(item); if (success) { fireAddEvent(item); } return success; } @Override public synchronized void add(int index, T item) { super.add(index, item); fireInsertEvent(index, item); } @Override public synchronized boolean addAll(int index, Collection<? extends T> items) { boolean success = super.addAll(index, items); if (success) { fireAddAllEvent(items); } return success; } @Override public synchronized boolean addAll(Collection<? extends T> items) { boolean success = super.addAll(items); if (success) { fireAddAllEvent(items); } return success; } public synchronized void addListener(ActiveListListener<T> listener) { if (this.listeners == null) { listeners = Lists.newArrayList(); } this.listeners.add(listener); } public synchronized void removeListener(ActiveListListener<T> listener) { if (this.listeners != null) { this.listeners.remove(listener); } } private void fireChangedEvent() { if (this.listeners == null) return; for (ActiveListListener<T> listener : listeners) { listener.onClear(); } } private void fireInsertEvent(int location, T item) { if (this.listeners == null) return; for (ActiveListListener<T> listener : listeners) { listener.onInsert(location, item); } } private void fireAddEvent(T item) { if (this.listeners == null) return; for (ActiveListListener<T> listener : listeners) { listener.onAdd(item); } } private void fireAddAllEvent(Collection<? extends T> items) { if (this.listeners == null) return; for (ActiveListListener<T> listener : listeners) { listener.onAddAll(items); } } } 

((ActiveList<Contact>) this.contacts).addListener(activeListListener); 

예를 참조https://github.com/davidevallicella/UnivrApp/

+0

길이가 길어집니다. 연락처 http://developer.android.com/reference/android/provider/ContactsContract.SyncColumns에 대한 버전 사용은 어떻습니까? – min2bro

관련 문제