I am working with an Android application which shows the list of contacts in the phone like Whats-app. I am successful with getting the contacts to the Application database. When I try to update my DB when a contact is newly added/edited/deleted using Content Observer, I mainly face two problems 1. When Calls ,
String contactName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
I am getting wrong name. eg:- I edited Samuel's Contact no but checking the above code getting David's name.
when I try to get contact number by using the code,
contactNumber = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));I am getting error
E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 402 rows, 41 columns. 03-01 17:16:56.546 3660-3660/com.xxxxxxxxx.xxxxx W/System.err: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.Please Anybody help me to find the solution. Here is my Code
public class ContactObserver extends ContentObserver { Intent i; private static final String TAG = "ObserverReceiver"; private Context context; BaseActivity mBaseActivity; public ContactObserver(Handler handler, BaseActivity context) { super(handler); this.mBaseActivity = context; this.context = context; } public ContactObserver() { super(null); } @Override public boolean deliverSelfNotifications() { return true; } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); if (!selfChange) { try { ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); Log.d(TAG, "Observer has been started.."); // Contacts Cursor final Cursor cur = context.getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); // Check which contact is added or updated if (cur != null) { while (cur.moveToNext()) { // Get contact added/updated timestamp but CONTACT_LAST_UPDATED_TIMESTAMP // Get new/updated contact detail here final String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); final String contactName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String contactNumber = null; if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { try { contactNumber = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } catch (Exception e) { e.printStackTrace(); } } String finalContactNumber = contactNumber; Thread thread = new Thread(new Runnable() { @Override public void run() { List<Contacts> sContacts = ContactDatabase .getDatabase(context) .contactsDao() .getBySystemid(id); Log.i("Contacts1+", new Gson().toJson(sContacts)); if (sContacts.size() > 0) { for (Contacts mContacts : sContacts) { String phone = finalContactNumber; if (phone == null) { phone = mContacts.getPhone(); } Log.i("Contacts1+", contactName + " : " + phone); if (phone != null && phone.length() > 0) { phone = phone.replace(" ", ""); } while (String.valueOf(phone.charAt(0)).equals("0")) { String num = ""; for (int i = 1; i < phone.length(); i++) { num = num + phone.charAt(i); } phone = num; } if (phone.length() == 10) { phone = getSharedPreference(AppConstants.SharedKey.COUNTRY_CODE) + phone; } if ((mContacts.getName() != contactName || mContacts.getPhone() != phone)) { mContacts.setName(contactName); if (!mContacts.getPhone().equalsIgnoreCase(phone)) { mContacts.setPhone(phone); mContacts.setIslisted("false"); } if (mContacts.getPhone().equalsIgnoreCase(phone) || mContacts.getName().equalsIgnoreCase(contactName)) { ContactDatabase.getDatabase(context) .contactsDao() .update(mContacts); cur.close(); } } } } else { Contacts mContacts = new Contacts(); String contactNumber = null; try { contactNumber = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); if (contactNumber != null && contactNumber.length() > 0) { contactNumber = contactNumber.replace(" ", ""); contactNumber = contactNumber.replace("-", ""); } while (String.valueOf(contactNumber.charAt(0)).equals("0")) { String num = ""; for (int i = 1; i < contactNumber.length(); i++) { num = num + contactNumber.charAt(i); } contactNumber = num; } if (contactNumber.length() == 10) { contactNumber = getSharedPreference(AppConstants.SharedKey.COUNTRY_CODE) + contactNumber; } String contactName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); mContacts.setPhone(contactNumber); mContacts.setName(contactName); mContacts.setSystemid(id); mContacts.setIslisted("false"); List<Contacts> cContacts = ContactDatabase .getDatabase(context) .contactsDao() .getbyPhone(contactNumber); if (cContacts.size() == 0) { ContactDatabase.getDatabase(context) .contactsDao() .insert(mContacts); } } catch (Exception e) { e.printStackTrace(); } } i = new Intent(context, ContactSynchService.class); context.startService(i); cur.close(); } }); thread.start(); } } } catch (Exception e) { e.printStackTrace(); } } } public String getSharedPreference(String key) { SharedPreferences prefs = mBaseActivity.getSharedPreferences(AppConstants.SHARED_KEY, MODE_PRIVATE); return prefs.getString(key, "DEFAULT"); } }
I tried these links, but none of them could give a solution.
ContentObserver for contact update manually
ContentObserver not working in android
Android: ContentObserver not working in android 4.3
Any help will be appreciated. Thanks in Advance