2014-05-21 16 views
8

Khi ứng dụng của tôi sử dụng nội dung từ android.provider.ContactsContract.Data (API> 11) và ContactsContract.Contacts.CONTENT_URI (API < 11) để điền Contacts.ContentObserver nên gọi nếu và chỉ khi ContactsContract.Contacts.CONTENT_URI thay đổi

Tôi đã cố gắng registerContentObserver() đối với những nhà cung cấp này. Nhưng nó gọi số ContentObserver của tôi ngay cả khi tôi cố Gọi cho một người từ thiết bị ngay khi tôi gọi điện. Nó kích hoạt ContentObserver của tôi không hữu ích cho tôi vì không có thay đổi nội dung trong Contacts Provider.

gốc Nguyên nhân:

Có vẻ như LAST_TIME_CONTACTED hoặc một cái gì đó trong ContactsContract.Contacts.CONTENT_URI làm thay đổi khi một cuộc gọi đã được thực hiện từ thiết bị mà wokes hợp pháp tăng ContentObserver.

Cố gắng:

private class ContactsContentObserver extends ContentObserver { 
    public ContactsContentObserver() { 
     super(null); 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
     Zname.getPreferences().setRefreshContact(true); 
    } 
} 

đăng ký ContentObserver trong OnCreate() của Activity

ContactsContentObserver contactsContentObserver = new ContactsContentObserver(); 
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, contactsContentObserver); 

Cố gắng với notifyForDescendents như false trên registerContentObserver. Tuy nhiên nó gây ra ContentObserver

Ques:

Làm thế nào người ta có thể đăng ký ContentObserver mà gây nên khi và chỉ khi liên lạc thông tin đang được CRUD (Create, Update, Delete) trừ Last_Time_Contacted hoặc hậu duệ của nó?

Trả lời

0

Như android.provider.ContactsContract cung cấp nội dung có thật sự phức tạp riêng mà làm cho ContentObserver khó khăn để thông báo chỉ trên contacts thay đổi nội dung ngoại trừ nó là LAST_TIME_CONTACTED lĩnh vực như mọi đồng nghiệp đi qua nói những điều này và vì thế nó được.

Cần phát triển logic riêng cho dù dữ liệu contacts có được cập nhật hay không khi thông báo ContentObserver.

Các điểm cần xem xét xây dựng logic cho dù contacts có thực sự được cập nhật hay không.

  • Kiểm tra trên cơ sở kiểm tra lần cuối. Phụ thuộc vào yêu cầu.
  • Thêm ContentObserver trong ServiceSTICKY để có thể ở đó khi liên hệ thay đổi.

Sync Phone Book Logic: -Như tôi đã duy trì liên lạc sử dụng SQLite, vì vậy kiểm tra lên cho dù đó tồn tại hay không và logic xây dựng w.r.t.

ContentValues values; 
Cursor cursor = Zname.getApplication().getContentResolver().query(DBConstant.All_Contacts_Columns.CONTENT_URI,null,DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER+ "=?",new String[] { _contact.getContactNumber() },null); 

if (cursor.getCount() <= 0) { 
     cursor.moveToFirst(); 
     Zname.getApplication().getContentResolver().delete(DBConstant.All_Contacts_Columns.CONTENT_URI,DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER+ "?=",new String[] { _contact.getContactNumber() }); 
     Log.i(TAG, "Updating zname phonebook"); 
     values = new ContentValues(); 
     values.put(DBConstant.All_Contacts_Columns.COLUMN_CONTACT_ID,_contact.getContactId()); 
     values.put(DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER,_contact.getContactNumber()); 
     values.put(DBConstant.All_Contacts_Columns.COLUMN_DISPLAY_NAME,_contact.getContactName()); 
     values.put(DBConstant.All_Contacts_Columns.COLUMN_ZNAME_DP_URL_SMALL,_contact.getContactPhotoUri().toString()); 

     Zname.getApplication().getContentResolver().insert(DBConstant.All_Contacts_Columns.CONTENT_URI,values); 

     if (cursor != null) 
       cursor.close(); 
    } 
5

Vấn đề cơ bản ở đây là đăng ký ContactsContract.Contacts.CONTENT_URI không hoạt động như bạn có thể suy nghĩ hợp lý.

Lý do tại sao bạn nhận được cập nhật ngay cả khi notifyForDescendentsfalse là do Uri kích hoạt quá trình cập nhật ... ContactsContract.Contacts.CONTENT_URIkhông hàng tiếp xúc đang được gọi.

Mã vi phạm trong ứng dụng Danh bạ có thể được tìm thấy tại GrepCode và có lỗi được gửi cho số này trên Google Code.

Vì vậy, để trả lời câu hỏi của bạn, bạn không thể đăng ký ContentObserver sẽ kích hoạt cho các trường cụ thể trên một liên hệ. Bạn sẽ cần phải có một cái gì đó trong ứng dụng của bạn mà sẽ theo dõi tính toán sự khác biệt bất cứ khi nào onChange cháy.

Các vấn đề liên quan