Почему не работает код удаления номера телефона контакта?

213
20 апреля 2017, 15:20

Необходимо реализовать удаление номера телефона из контакта. Мне посоветовали код, по словам автора кода у него всё работало. Однако у меня код эффекта не даёт, ошибок тоже нету.

private final String queryPhone = ContactsContract.Contacts.Data.RAW_CONTACT_ID + 
    "=? AND " +
    ContactsContract.Contacts.Data.MIMETYPE + 
    "='" + 
    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + 
    "'" + 
    " AND ";
private final String queryByNumber = ContactsContract.CommonDataKinds.Phone.NUMBER + "=?";
public void removePhoneByNumber(Long contactId, String phoneNumber) {
    ArrayList<ContentProviderOperation> os = new ArrayList();
    String[] phoneArgs = new String[] {
        String.valueOf(contactId), phoneNumber
    };
    os.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
            .withSelection(queryPhone + queryByNumber, phoneArgs)
            .build());
    try {
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, os);
    }
    catch (RemoteException e) {
        e.printStackTrace();
    }
    catch (OperationApplicationException e) {
        e.printStackTrace();
    }
}

В манифесте разрешения на чтение и запись контактов прописаны. В чём может быть проблема?

Answer 1

Есть подозрение, что я нашёл возможную причину вашей проблему. Для этого пришлось перелопатить немало англоязычных форумов и поставить экспериментов. В английском сегменте SO натолкнулся на вопрос с похоже на вашу проблемой. В ответе написано, что именно в Lollipop к запросу нужно добавлять не только номер телефона, но и его тип:

private final String queryPhone = Data.RAW_CONTACT_ID + "=? AND "
       + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'";
private final String queryByType = " AND " + Phone.TYPE + "=?";
private final String queryByNumber = " AND "
        + "replace(replace(replace(" + Phone.NUMBER + ", ' ', ''), '-', ''), '+', '')"
        + "=?";
public void removePhone(Long contactId, int phoneType, String phoneNumber) {
    ArrayList<ContentProviderOperation> ops = new ArrayList();
    String[] phoneArgs = new String[] {String.valueOf(contactId),
            String.valueOf(phoneType),
            phoneNumber.replaceAll("[^0-9]", "")};
    ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
            .withSelection(queryPhone + queryByType + queryByNumber, phoneArgs)
            .build());
    try {
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    }
    catch (RemoteException e) {
        e.printStackTrace();
    }
    catch (OperationApplicationException e) {
        e.printStackTrace();
    }
}

И в обработчике клика

removePhone(1L, Phone.TYPE_MOBILE, "+71234567890");
READ ALSO
Как задается поведение интерфейсам?

Как задается поведение интерфейсам?

Почему при имплементировании некоторых интерфейсов они обладают уже неким поведением? Например MouseListener, ActionListener, KeyListener, большинство функциональных...

214
Как убрать поля вокруг текста у кнопки?

Как убрать поля вокруг текста у кнопки?

Хочу создать стиль для кнопки, чтобы в нем установить минимальные поля вокруг текстаКак должен выглядеть код такого стиля?

219
Как собрать запрос по частям?

Как собрать запрос по частям?

У меня есть такой запрос:

262