我们在最近更新到Lollipop的Nexus设备上遇到了一个奇怪的问题。
无法再删除通过该程序添加的联系人。它要么不提供删除选项,要么删除它,那么删除本身不起作用(即使它说它确实如此)。 有趣的是,我下载了第三方联系人应用程序,删除它们没有问题。
同样,我们无法通过该程序删除它。 这些都是在升级之前完美运行的所有事情。
这是用于插入联系人的代码:
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());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
.build());
if(contact.phone != null && contact.phone !=" "){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
.build());
}
if(contact.phone2 != null && contact.phone2 !=" "){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone2)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
.build());
}
if(contact.phone3 != null && contact.phone3 !=" "){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone3)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
.build());
}
if(contact.fax != null && contact.fax !=" "){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.fax)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_FAX_WORK)
.build());
}
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET,(" ".equals(contact.getAddress())?contact.location:contact.getAddress()))
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY,ctx.getResources().getString(R.string.meuhedet))
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, Long.parseLong(Groupid))
.build());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap photo = BitmapFactory.decodeResource(ctx.getResources(),R.drawable.logo_meuhedet);
photo.compress(Bitmap.CompressFormat.PNG, 100, baos);
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, baos.toByteArray())
.build());
try {
ContentProviderResult [] res =ctx.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
rawContactID = ContentUris.parseId(res[0].uri);
Log.d(TAG,"contact added = " + rawContactID);
boolean result = db.saveContactsIntoDatabase(rawContactID, index, ContactKey);
if(res[0].uri!=null && result){
((Activity) ctx).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ctx, R.string.successfully_saved_contact, Toast.LENGTH_SHORT).show();
}
});
}
} catch (Exception e) {
}
}
可以看出,我们保存返回的id,以便我们可以在delete中使用它:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(ContactsContract.RawContacts.CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)})
.build());
try {
ContentProviderResult [] res = ctx.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Log.d(TAG,"delete count= " + res[0].count);
if(res[0].count > 0 && result){
((Activity) ctx).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ctx, R.string.successfully_deleted_contact, Toast.LENGTH_SHORT).show();
}
});
}
} catch (Exception e) {
}
对于受影响的行数,删除返回0,因此显然不会删除它。
这是Lollipop的问题还是我们添加联系人的方式有问题?
答案 0 :(得分:1)
经过几天的战斗&#34;根据申请,我找到了原因。
现在看来您必须为地址提供类型(StructuredPostal.TYPE)。没有它,它根本无法正常工作。
这似乎只是棒棒糖的情况。我们在其他版本上测试过它并没有问题。
如果类型现在是强制性的,我原本期望插入失败。
答案 1 :(得分:0)
我遇到了类似的问题,导致某些联系人无法删除。我发现问题是因为我使用 Contacts.CONTENT_LOOKUP_URI 而不是全局 Contacts.CONTENT_URI
我不知道为什么,但StackOverflow中的大量示例使用CONTENT_LOOKUP_URI来删除联系人。