I programmatically add a contact, but then when I want to delete it fails. He writes "It is impossible to delete contacts from an account that is read-only, but you can hide them in contact lists." Add so.
private void addContact(String name) { Utils utils = Utils.getInstance(this); if (utils.contactExists(name)) return; Account account = utils.getAccount(ACCOUNT_TYPE); ArrayList<ContentProviderOperation> ops = new ArrayList<>(); int rawContactInsertIndex = ops.size(); ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) .withValue(RawContacts.ACCOUNT_TYPE, account != null ? account.type : null) .withValue(RawContacts.ACCOUNT_NAME, account != null ? account.name : null) .build()); ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(CommonDataKinds.StructuredName.GIVEN_NAME, "Semen") .withValue(CommonDataKinds.StructuredName.FAMILY_NAME, "Middle name") .build()); ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(Data.MIMETYPE, MIMETYPE) .withValue(Data.DATA1, 12345) .withValue(Data.DATA2, "sample") .withValue(Data.DATA3, "sample") .build()); try { ContentProviderResult[] results = getContentResolver().applyBatch(AUTHORITY, ops); for (ContentProviderResult result : results) { Log.d("logba", "addContact : result=" + result); } } catch (Exception e) { e.printStackTrace(); } } syncadapter.xml
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="com.example.account" android:allowParallelSyncs="true" android:contentAuthority="com.android.contacts" android:isAlwaysSyncable="true" android:supportsUploading="true" android:userVisible="true" />