Чтение телефонных контактов не работает на нескольких устройствах, например: S8, S9 и т. Д. - PullRequest
0 голосов
/ 28 января 2019

Я написал свой код для чтения контактов на телефоне Android.Но на некоторых телефонах произошел сбой, и я попытался это исправить.

На некоторых телефонах он работает хорошо, но на некоторых телефонах не работает.Я уже добавил код проверки прав доступа.

В чем моя вина?

  Cursor cursor = activity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER, "data1", "contact_id"}, "has_phone_number=?", new String[]{"1"}, ContactsContract.Contacts.DISPLAY_NAME);
    int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    int phoneNumberIndex = cursor.getColumnIndex("data1");
    ArrayList<FmAddress> contactlist = new ArrayList<>();

    if (cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                String name = cursor.getString(nameIndex);
                String phoneNumber = cursor.getString(phoneNumberIndex);
                if (!(name == null || phoneNumber == null)) {
                    String phoneNumber1 = phoneNumber.replaceAll("[^0-9]", "");
                    FmAddress acontact = new FmAddress();
                    acontact.uid = 0;
                    acontact.phonenum = phoneNumber1;
                    acontact.name = name;

                    contactlist.add(acontact);
                }
            }
        }
    }

    cursor.close();

1 Ответ

0 голосов
/ 28 января 2019

Ваш код немного странный, вы правильно используете неявное объединение, которое получаете, запрашивая таблицу Phone.CONTENT_URI (см. https://developer.android.com/reference/android/provider/ContactsContract.Data#columns), но имена полей кажутся немного не такими.

Обратите внимание, что при запросе непосредственно к таблице Phone.CONTENT_URI вам не нужно проверять HAS_PHONE_NUMBER, так как вы запрашиваете строки, содержащие информацию о телефоне.

Вот, возможно, фиксированный код:

String[] projection = new String[]{Phone.DISPLAY_NAME, Phone.NUMBER, Phone.CONTACT_ID};
Cursor cursor = getContentResolver().query(Phone.CONTENT_URI, projection, null, null, Phone.DISPLAY_NAME);
ArrayList<FmAddress> contactlist = new ArrayList<>();

while (cursor.moveToNext()) {
    String name = cursor.getString(0);
    String phoneNumber = cursor.getString(1);
    long contactId = cursor.getLong(2);

    Log.i("Phones", contactId + ", " + name + ", " + phoneNumber);

    if (name != null && phoneNumber != null) {
        String phoneNumber1 = phoneNumber.replaceAll("[^0-9]", "");
        FmAddress acontact = new FmAddress();
        acontact.uid = contactId;
        acontact.phonenum = phoneNumber1;
        acontact.name = name;

        contactlist.add(acontact);
    }
}
cursor.close();
...