uni-app中uni.makePhoneCall在安卓11.0无论是否有拨打电话权限都返回"errMsg": "makePhoneCall:ok"

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

uni-app中uni.makePhoneCall在安卓11.0无论是否有拨打电话权限都返回"errMsg": “makePhoneCall:ok”

其他版本没试,有遇到相同情况的吗?HbuilderX 4.36

1 回复

在uni-app中,uni.makePhoneCall API 用于拨打电话。如果在安卓11.0(API级别30)设备上,无论是否有拨打电话权限都返回 "errMsg": "makePhoneCall:ok",这通常意味着API调用本身没有语法错误,但实际的拨打电话行为可能受到权限或系统策略的限制。

从Android 10(API级别29)开始,Google引入了更严格的权限管理,特别是针对敏感操作如拨打电话。在Android 11上,这种限制可能进一步加强,尤其是当应用尝试在后台执行这些操作时。以下是一些检查和代码示例,以确保你的应用正确处理拨打电话的权限和逻辑。

1. 请求拨打电话权限

首先,确保你的manifest.json文件中已经声明了拨打电话的权限:

"mp-weixin": { // 或其他平台配置
    "permission": {
        "scope.phone": {
            "desc": "你的位置信息将用于小程序拨打电话功能"
        }
    }
},
"android": {
    "permissions": [
        "android.permission.CALL_PHONE"
    ]
}

2. 动态请求权限(如适用)

对于Android,你可能需要在运行时动态请求拨打电话权限,尽管uni-app的权限管理通常简化了这一过程,但在某些情况下你可能需要自定义代码来处理:

// 示例:在需要拨打电话之前检查并请求权限(可能需要原生插件支持)
#ifdef APP-PLUS
plus.android.requestPermissions(['android.permission.CALL_PHONE'], function(event) {
    if (event.deniedAlways.indexOf('android.permission.CALL_PHONE') !== -1) {
        console.error('用户永久拒绝了拨打电话权限');
    } else if (event.granted.indexOf('android.permission.CALL_PHONE') !== -1) {
        uni.makePhoneCall({
            phoneNumber: '1234567890',
            success: function() {
                console.log('拨打电话成功');
            },
            fail: function(err) {
                console.error('拨打电话失败', err);
            }
        });
    } else {
        console.error('拨打电话权限被拒绝');
    }
});
#endif

3. 检查系统行为

即使权限被授予,Android 11的系统行为可能阻止应用在后台拨打电话,或者在没有用户交互的情况下执行敏感操作。确保你的应用在前台,并且用户已经与界面进行了交互(例如点击了一个按钮)。

结论

由于"errMsg": "makePhoneCall:ok"表明API调用本身没有问题,问题可能出在权限处理或系统行为上。上述代码和步骤应该帮助你更好地诊断和解决在Android 11上拨打电话的问题。如果问题依旧存在,建议检查设备的安全设置或考虑使用其他方式(如引导用户手动拨打电话)。

回到顶部