无法在Lollipop中删除以编程方式添加的联系人

时间:2014-12-01 12:58:41

标签: android android-contacts android-5.0-lollipop

我们在最近更新到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的问题还是我们添加联系人的方式有问题?

2 个答案:

答案 0 :(得分:1)

经过几天的战斗&#34;根据申请,我找到了原因。

现在看来您必须为地址提供类型(StructuredPostal.TYPE)。没有它,它根本无法正常工作。

这似乎只是棒棒糖的情况。我们在其他版本上测试过它并没有问题。

如果类型现在是强制性的,我原本期望插入失败。

答案 1 :(得分:0)

我遇到了类似的问题,导致某些联系人无法删除。我发现问题是因为我使用 Contacts.CONTENT_LOOKUP_URI 而不是全局 Contacts.CONTENT_URI

我不知道为什么,但StackOverflow中的大量示例使用CONTENT_LOOKUP_URI来删除联系人。