Android 通过ContactsContract和ContentProvider添加带有照片的新联系人

Android 通过ContactsContract和ContentProvider添加带有照片的新联系人,android,android-contentprovider,android-contacts,contactscontract,Android,Android Contentprovider,Android Contacts,Contactscontract,我一整天都在尝试将带有照片的联系人添加到Android联系人中。最后,我将图片添加到联系人中,但我无法添加任何姓名或电话号码。联系人显示为“(未知)”,带有正确的照片 我的代码: private void addContact2() { final String displayName = "XYZA"; final String mobileNumber = "666666"; final byte[] photoByteArray; // initalized elsewhere Arra

我一整天都在尝试将带有照片的联系人添加到Android联系人中。最后,我将图片添加到联系人中,但我无法添加任何姓名或电话号码。联系人显示为“(未知)”,带有正确的照片

我的代码:

private void addContact2() {
final String displayName = "XYZA";
final String mobileNumber = "666666";
final byte[] photoByteArray; // initalized elsewhere

ArrayList<ContentProviderOperation> ops = new ArrayList<>();

ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "")
        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, "")
        .build());

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
        .withValue(ContactsContract.Data.RAW_CONTACT_ID, 0)
        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
        .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName)
        //.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, displayName)
        .build());

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
        .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, photoByteArray)
        .build());

Uri newContactUri = null;
ContentProviderResult[] res = null;
try {
    final ContentResolver contentResolver = getContentResolver();
    res = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    if (res != null && res.length > 0 && res[0] != null) {
        newContactUri = res[0].uri;
        Log.d(CallActivity.class.getName(), "URI added contact:"+ newContactUri);
        Toast.makeText(this, "Successfully added " + displayName, Toast.LENGTH_LONG).show();
    }
    else Log.e(CallActivity.class.getName(), "Contact not added.");
} catch (NullPointerException | RemoteException | OperationApplicationException e) {
    Log.e(CallActivity.class.getName(), e.getMessage(), e);
}
}
private void addContact2(){
最终字符串displayName=“XYZA”;
最终字符串mobileNumber=“666666”;
最后一个字节[]photoByteArray;//在别处初始化
ArrayList ops=新的ArrayList();
添加(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT\u URI)
.withValue(contacts contract.raw contacts.ACCOUNT_TYPE,“”)
.withValue(contacts contract.raw contacts.ACCOUNT_NAME,“”)
.build());
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带值(contacts contract.Data.RAW\u CONTACT\u ID,0)
.withValue(contacts contract.Data.MIMETYPE、contacts contract.commonDataTypes.StructuredName.CONTENT\u ITEM\u TYPE)
.withValue(contacts contract.CommonDataTypes.StructuredName.DISPLAY\u NAME,displayName)
//.withValue(contacts contract.CommonDataTypes.StructuredName.GIVEN_NAME,displayName)
.build());
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带ValueBackReference(contacts contract.Data.RAW\u CONTACT\u ID,0)
.withValue(contacts contract.Data.MIMETYPE、contacts contract.commondatatypes.Photo.CONTENT\u ITEM\u TYPE)
.带值(contacts contract.commondatatypes.Photo.Photo,photoByteArray)
.build());
Uri newContactUri=null;
ContentProviderResult[]res=null;
试一试{
final ContentResolver ContentResolver=getContentResolver();
res=contentResolver.applyBatch(contacts contract.AUTHORITY,ops);
如果(res!=null&&res.length>0&&res[0]!=null){
newContactUri=res[0].uri;
Log.d(CallActivity.class.getName(),“URI添加联系人:”+newContactUri);
Toast.makeText(此“已成功添加”+displayName,Toast.LENGTH_LONG.show();
}
else Log.e(CallActivity.class.getName(),“未添加联系人”);
}捕获(NullPointerException | RemoteException | OperationApplicationException e){
Log.e(CallActivity.class.getName(),e.getMessage(),e);
}
}
好的,我已经修好了。在“name”ops.add上,我用value(contacts contract.Data.RAW\u CONTACT\u ID,0)写了
,而不是
。用valuebackreference(contacts contract.Data.RAW\u CONTACT\u ID,0)
。现在一切正常