Необходимо реализовать удаление номера телефона из контакта. Мне посоветовали код, по словам автора кода у него всё работало. Однако у меня код эффекта не даёт, ошибок тоже нету.
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();
}
}
В манифесте разрешения на чтение и запись контактов прописаны. В чём может быть проблема?
Есть подозрение, что я нашёл возможную причину вашей проблему. Для этого пришлось перелопатить немало англоязычных форумов и поставить экспериментов. В английском сегменте 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");
Сборка персонального компьютера от Artline: умный выбор для современных пользователей