uni-app 【报Bug】plus.android.requestPermissions 获取通话记录权限无法正常判断真实应用权限

uni-app 【报Bug】plus.android.requestPermissions 获取通话记录权限无法正常判断真实应用权限

示例代码:

ANDRIOD_PHONE_STATE() {  
    plus.android.requestPermissions(  
        ['android.permission.CALL_PHONE', 'android.permission.READ_CALL_LOG', 'android.permission.WRITE_CALL_LOG', 'android.permission.READ_CONTACTS'],  
        function(e) {  
            console.log(e.deniedAlways);  
            console.log(e.deniedPresent);  
            console.log(e.granted);  
            if (e.deniedAlways.length > 0) {  
                //权限被永久拒绝  
                uni.showToast({  
                    title: '权限被永久拒绝',  
                    duration: 2000  
                });  
                return;  
            }  
            if (e.deniedPresent.length > 0) {  
                //权限被临时拒绝  
                uni.showToast({  
                    title: '权限被临时拒绝',  
                    duration: 2000  
                });  
                // 弹出提示框解释为何需要定位权限,可再次调用plus.android.requestPermissions申请权限  
                console.log('Present Denied!!! ' + e.deniedPresent.toString());  
                return;  
            }  
            if (e.granted.length > 0) {  
                //权限被允许  
                uni.showToast({  
                    title: '权限通过',  
                    duration: 2000  
                });  
            }  
        },  
        function(e) {  
            console.log('Request Permissions error:' + JSON.stringify(e));  
        }  
    );  
}

操作步骤:

  • 执行代码示例中获取权限的代码

预期结果:

  • 希望能正常获取通话记录的权限

实际结果:

  • 即使在应用管理层 授权允许了通话记录 也无法通过api判断出正确的权限结果

bug描述:

  • 授权通话记录这块 授权过程中 即使应用管理层 授权允许了通话记录, 在经过上面api提供的授权判断时 依然会返回授权永久禁止。

更多关于uni-app 【报Bug】plus.android.requestPermissions 获取通话记录权限无法正常判断真实应用权限的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 【报Bug】plus.android.requestPermissions 获取通话记录权限无法正常判断真实应用权限的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的权限检测问题。plus.android.requestPermissions 对于 READ_CALL_LOGWRITE_CALL_LOG 等通话记录权限的检测确实存在不准确的情况。

问题核心在于:Android系统对通话记录权限的管理比较特殊,requestPermissions API在某些机型上无法正确获取这些权限的真实状态。

临时解决方案:

  1. 使用原生Android代码进行权限验证:
function checkCallLogPermission() {
  const Context = plus.android.importClass('android.content.Context');
  const PackageManager = plus.android.importClass('android.content.pm.PackageManager');
  const main = plus.android.runtimeMainActivity();
  
  const hasPermission = main.checkSelfPermission('android.permission.READ_CALL_LOG') 
    === PackageManager.PERMISSION_GRANTED;
  
  return hasPermission;
}
  1. 结合使用两种检测方式:
ANDRIOD_PHONE_STATE() {
  // 先使用原生方式检测
  const hasPermission = checkCallLogPermission();
  
  if (!hasPermission) {
    // 如果没有权限,再使用requestPermissions申请
    plus.android.requestPermissions(
      ['android.permission.READ_CALL_LOG'],
      function(e) {
        // 这里主要依赖回调,不依赖granted数组
        if (e.deniedAlways.length === 0 && e.deniedPresent.length === 0) {
          // 申请成功
          uni.showToast({ title: '权限通过', duration: 2000 });
        }
      },
      function(e) {
        console.log('Request Permissions error:' + JSON.stringify(e));
      }
    );
  } else {
    uni.showToast({ title: '已有权限', duration: 2000 });
  }
}
回到顶部