uni-app 华为手机保存电话号到通讯录异常

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app 华为手机保存电话号到通讯录异常

产品分类

uniapp/App

开发环境信息

详情
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 Windows 10
HBuilderX类型 正式
HBuilderX版本号 3.8.4
手机系统 全部
手机厂商 华为
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

测试过的手机

华为手机 鸿蒙3.0

示例代码

uni.addPhoneContact({
    firstName: item.name,
    mobilePhoneNumber: item.phone,
    success: function() {
        console.log('success');
        uni.showToast({
            title: '保存成功',
            icon: 'none',
            duration: 1000
        })
    },
    fail: function() {
        console.log('fail');
        uni.showToast({
            title: '保存失败',
            icon: 'none',
            duration: 1000
        })
    }
});

操作步骤

调用 uni.addPhoneContact 添加通讯录联系人

预期结果

可以正常保存访问

实际结果

可以导入到通讯录,但是一打开导入的手机号详情就会立即返回,并自动删除导入的联系人信息。

bug描述

华为手机使用 uni.addPhoneContact 保存电话号码到通讯录异常


4 回复

博主该问题是否解决,我这也是发布部分华为手机出现同样的问题


华为pure 70,鸿蒙4.2 ,也是一样,正常保存到通讯录,然后点击联系人就自动消失

有人解决了吗,我这边也遇到了,目前排查是畅联的问题,卸载后添加就正常

在处理uni-app在华为手机上保存电话号码到通讯录的异常问题时,通常涉及到访问设备通讯录权限、使用正确的API以及处理不同设备间的兼容性问题。以下是一个基本的代码示例,展示了如何在uni-app中实现保存联系人功能,并附带一些可能的调试思路。

代码示例

首先,确保在manifest.json中配置了必要的权限:

"mp-weixin": { // 示例平台,针对华为需配置对应的Android平台
    "requiredPrivateInfos": ["addPhoneContact"]
},
"plus": {
    "distribute": {
        "android": {
            "permissions": [
                "android.permission.READ_CONTACTS",
                "android.permission.WRITE_CONTACTS"
            ]
        }
    }
}

在页面中实现保存联系人的功能:

// 请求权限
function requestPermissions() {
    return new Promise((resolve, reject) => {
        plus.android.requestPermissions(['android.permission.READ_CONTACTS', 'android.permission.WRITE_CONTACTS'], (event) => {
            if (event.deniedAlways.length === 0 && event.denied.length === 0) {
                resolve();
            } else {
                reject('Permission denied');
            }
        });
    });
}

// 保存联系人
async function saveContact(name, phoneNumber) {
    try {
        await requestPermissions();
        
        const Contact = plus.android.importClass('android.provider.ContactsContract$Contacts');
        const RawContacts = plus.android.importClass('android.provider.ContactsContract$RawContacts');
        const ContentValues = plus.android.importClass('android.content.ContentValues');
        const ContentUris = plus.android.importClass('android.content.ContentUris');
        const context = plus.android.runtimeMainActivity();
        const contentResolver = context.getContentResolver();

        // 插入RawContact
        const rawContactUri = contentResolver.insert(RawContacts.CONTENT_URI, new ContentValues());
        const contactId = ContentUris.parseId(rawContactUri);

        // 插入联系人数据
        const values = new ContentValues();
        values.put(Contact.DISPLAY_NAME, name);
        values.put(Contact.HAS_PHONE_NUMBER, true);
        contentResolver.update(Contact.CONTENT_URI, values, Contact._ID + "=?", [contactId]);

        // 插入电话号码
        const phoneValues = new ContentValues();
        phoneValues.put('number', phoneNumber);
        phoneValues.put('type', plus.android.importClass('android.provider.ContactsContract$CommonDataKinds$Phone').TYPE_MOBILE);
        contentResolver.insert(plus.android.importClass('android.provider.ContactsContract$Data').CONTENT_URI, phoneValues);

        uni.showToast({
            title: 'Contact saved successfully',
            icon: 'success'
        });
    } catch (error) {
        console.error('Error saving contact:', error);
        uni.showToast({
            title: 'Failed to save contact',
            icon: 'none'
        });
    }
}

// 调用保存联系人函数
saveContact('John Doe', '1234567890');

调试思路

  1. 权限检查:确保应用已获得读写联系人权限。
  2. API兼容性:检查ContentUrisContentValues等API在不同Android版本上的行为是否一致。
  3. 设备日志:查看华为手机的系统日志,寻找可能的异常信息。
  4. 模拟器与真机测试:在模拟器上测试通过后,务必在真机上进行全面测试,因为真机环境可能包含更多不可预见的因素。

通过上述代码和调试思路,可以帮助你定位并解决在华为手机上保存联系人时遇到的问题。

回到顶部