s***@126.com
s***@126.com
  • 发布:2023-02-09 18:00
  • 更新:2024-06-07 16:43
  • 阅读:773

通讯录联系人删除不成功

分类:uni-app

如题,在hbuilder uniapp 中,无论是真机调试还是打包android运行,显示的结果是删除成功,但是实际上联系人还在,以下是代码,求帮助

测试机:红米K40S

刚刚换手机试了一次,可以删除,但是红米手机删除不了啊,咋回事,求大神

// 删除数据  
// 其中obj为[例]: {displayName: "钱老板1", phoneNumbers: "13822222222"}}  
// chkContactsWrite() 为权限验证  
doDistoryContact(obj) {  
    let that = this  
    this.chkContactsWrite().then(() => {  
        // that.makeCompleteModal.show = true // 执行完成后显示  
        console.log('权限验证已完成,准备删除')  
        plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (addressBook) => {  
            addressBook.find(null, function(contacts) {  
                if (contacts.length > 0) {  
                    var dc = contacts[0]  
                    console.log('dc的值为:', JSON.stringify(dc))  
                    dc.remove(() => {  
                        console.log("Remove " + dc.displayName + " success!")  
                    }, (e) => {  
                        console.log(e.message)  
                    })  
                }  
            }, (e) => {  
                uni.showToast({  
                    title: e.message,  
                    icon: 'none'  
                })  
            }, {  
                filter: [{  
                        logic: "or",  
                        field: "displayName",  
                        value: "*" + obj.displayName + "*"  
                    },  
                    {  
                        logic: "or",  
                        field: "phoneNumbers",  
                        value: "*" + obj.phoneNumbers + "*"  
                    }  
                ],  
                multi: false  
            })  
        })  
    })  
},

console 内容

2023-02-09 18:00 负责人:DCloud_Android_DQQ 分享
已邀请:
4***@qq.com

4***@qq.com

要删除两个地方的 一个是元数据raw_contacts 一个是 存储的对象data (不删除这个会一个“无姓名”的空联系人)

            deleteContact(contactId) {  
//根据联系人id删除数据  
                try {  
                    console.log(contactId)  

                    var Uri = plus.android.importClass('android.net.Uri');  
                    var ContentResolver = plus.android.importClass('android.content.ContentResolver');//必须导入不能删除  
                    var ContactsContract = plus.android.importClass('android.provider.ContactsContract');//必须导入不能删除  

                    var rawContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");  
                    var dataUri = Uri.parse("content://com.android.contacts/data");  

                    var resolver = plus.android.runtimeMainActivity().getContentResolver();  

                    // Delete data based on raw_contact_id  
                    var res1 = resolver.delete(dataUri, "raw_contact_id=?", [contactId.toString()]);  

                    // Delete raw_contact  
                    var res2 = resolver.delete(rawContactsUri, "_id=?", [contactId.toString()]);  

                    console.log(res1, res2)  

                } catch (e) {  
                    console.log(e)  
                }  
            }  

//参考调用  
    plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function (addressbook) {  
        console.log('获取通讯录对象成功')  
        console.log(addressbook)  
        addressbook.find(["displayName", "phoneNumbers", "note"], function (contacts) {  
            console.log("获取联系人成功")  
            //console.log(JSON.stringify(contacts))  
            //过滤备注为 #aaa 的列表  
            const delArr = contacts.filter(contact => contact.note === '#aaa')  
            console.log(JSON.stringify(delArr))  
            //遍历进行删除  
            const ids = []  
            for (var i = 0; i < delArr.length; i++) {  
                var dc = delArr[i]  
                const aaa = dc.displayName  
                const id = dc.id  
                ids.push(id)  
                dc.remove(() => {  
                    console.log('删除联系人' + aaa + '成功')  
                }, (e) => {  
                    console.log('删除联系人' + aaa + '失败', e)  
                })  
            }  

            //尝试调用原生删除  
            for (var i = 0; i < ids.length; i++) {  
                const id = ids[i]  
                that.deleteContact(id)  
            }  
        })  
    })  
})
s***@126.com

s***@126.com (作者)

有没有大神帮忙下,卡在这里了,求大神

s***@126.com

s***@126.com (作者)

我试了在filter条件中去掉两侧的 “*” 、也试了只留下一个displayName座位条件,结果是一样的,看似console.log删除了,但是无法真实删除,求大神看看
测试机:红米K40

s***@126.com

s***@126.com (作者)

求助大神啊

DCloud_Android_DQQ

DCloud_Android_DQQ

提供一下完整的可运行示例。

现在的示例 没有chkContactsWrite

  • s***@126.com (作者)

    plus不好用,使用原生android 解决了,谢谢

    2023-02-15 18:10

deny

deny - .....

请问原生android的代码是什么?能否粘贴部分给参考下?

  • s***@126.com (作者)

    只能将常规的安卓代码转换为uniapp可识别的JS,无其他办法,参考安卓代码:


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

    String id = getContactID(contact.getName());
    //delete contact
    ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
    .withSelection(ContactsContract.RawContacts.CONTACT_ID+"="+id, null)
    .build());
    //delete contact information such as phone number,email
    ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
    .withSelection(COLUMN_CONTACT_ID + "=" + id, null)
    .build());
    Log.d(TAG, "delete contact: " + contact.getName());

    try {
    contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    Log.d(TAG, "delete contact success");
    } catch (Exception e) {
    Log.d(TAG, "delete contact failed");
    Log.e(TAG, e.getMessage());
    }

    2023-04-06 20:00

沐子鱼

沐子鱼 - 你好

的确 现在还是删除不了 调用了 评论里的 可以 感谢

清清888

清清888 - 123123

原生转js的代码可以贴一下吗?谢谢

要回复问题请先登录注册