Обновление контактов в БД Не работает с ContentObserver - PullRequest
0 голосов
/ 01 марта 2019

Я работаю с приложением Android, которое показывает список контактов в телефоне, например Whats-app.Я успешно получаю контакты в базу данных приложений.Когда я пытаюсь обновить свою БД, когда контакт добавляется / редактируется / удаляется с помощью Content Observer, я в основном сталкиваюсь с двумя проблемами: 1. При вызовах

String contactName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

я получаю неправильное имя.Например: - Я отредактировал номер контакта Самуила, но проверил приведенный выше код, получив имя Дэвида.

когда я пытаюсь получить контактный номер с помощью кода,

 contactNumber = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

Я получаю сообщение об ошибке

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.

Пожалуйста, кто-нибудь поможет мне найти решение.Вот мой код

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


}

Я пробовал эти ссылки, но ни одна из них не могла дать решение.

ContentObserver для обновления контактов вручную

ContentObserver не работает в Android

Android: ContentObserver не работает в Android 4.3

Любая помощь будет оценена.Заранее спасибо

...