uniapp 在miui里调用uni.makephonecall失败是怎么回事?

在uniapp开发中,调用uni.makePhoneCall在MIUI系统上无法正常拨打电话,提示失败。其他Android系统和iOS都正常,只有MIUI会出现这个问题。请问这是什么原因导致的?有没有解决方法?MIUI的权限设置或者其他限制导致的吗?

2 回复

可能是MIUI系统权限问题。检查是否授权拨打电话权限,或尝试在manifest.json中配置拨号白名单。


在MIUI系统中,uni.makePhoneCall 调用失败通常是由于MIUI系统权限管理严格导致的。以下是常见原因及解决方案:

常见原因

  1. MIUI权限拦截:MIUI系统对电话权限有额外拦截机制,可能默认阻止拨号。
  2. 未授权电话权限:应用未获取 android.permission.CALL_PHONE 权限。
  3. 号码格式错误:传入的号码包含非法字符或格式不正确。
  4. 系统限制:部分MIUI版本可能对非系统应用拨号功能有限制。

解决方案

  1. 检查权限配置

    • manifest.json 中确保已声明电话权限:
      {
        "app-plus": {
          "permissions": [
            "makePhoneCall"
          ]
        }
      }
      
    • 对于Android,还需在原生配置中声明(HBuilderX项目中通常自动处理)。
  2. 动态请求权限(Android):

    • 在调用前检查并申请权限:
      // 检查权限
      uni.authorize({
        scope: 'scope.phone',
        success: () => {
          uni.makePhoneCall({ phoneNumber: '123456789' });
        },
        fail: () => {
          uni.showModal({
            content: '需要电话权限才能拨号,请授权',
            success: (res) => {
              if (res.confirm) {
                uni.openSetting(); // 引导用户开启权限
              }
            }
          });
        }
      });
      
  3. 处理MIUI特殊设置

    • 提示用户在 MIUI安全中心应用权限管理 中手动开启“拨打电话”权限。
    • 路径示例:设置 → 应用管理 → 权限 → 电话 → 允许。
  4. 检查号码格式

    • 确保号码为纯数字(如 "10086"),无空格或特殊字符。
  5. 使用 tel: 链接备用方案

    uni.navigateTo({
      url: 'tel:123456789' // 直接跳转系统拨号界面
    });
    

注意事项

  • 在部分MIUI版本中,即使授权,也可能需用户手动确认弹窗。
  • 测试时使用真机,并确保MIUI系统为最新版本。

通过以上步骤,通常可解决MIUI中拨号失败的问题。如果问题持续,建议检查HBuilderX版本或提交详细日志至DCloud社区。

回到顶部