Firstly use ContentProviderOperation's way to insert a new Contact.
final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
Bitmap bmp = YCardImageLoader.getInstance().getBitmapByCache(mTask.getImageUrl());
if (bmp != null ) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 100, stream);
byte[] bytes = stream.toByteArray();
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE)
.withValue(Photo.PHOTO, bytes)
.build());
}
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.DISPLAY_NAME, mContact.getName())
.build());
ContentProviderResult[] result = SaveToPbkActivity.this.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Then get result uri as the ACTION_EDIT uri, put other extras, startActivityForResult(intent, REQUEST_INSERT_CONTACT).
Intent editIntent = new Intent(Intent.ACTION_EDIT);
uri = result[0].uri;
editIntent.setDataAndType(uri, Contacts.CONTENT_ITEM_TYPE);
editIntent.putExtra("finishActivityOnSaveCompleted", true);
putExtras(editIntent, null);
startActivityForResult(editIntent, REQUEST_INSERT_CONTACT);
because we insert first, we will delete it when resultCode != RESULT_OK
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_INSERT_CONTACT) {
if (resultCode == RESULT_OK) {
//SAVE SUCCESS
} else {
ContentResolver cr = getContentResolver();
cr.delete(uri, null, null);
}
} }
At last sorry for my english!