Cordova 多重权限

Cordova multiple permissions

我需要一种在运行时间同时请求所有权限的方法。

我正在使用这个插件 https://github.com/NeoLSN/cordova-plugin-android-permissions,但是当 运行 应用程序正在 运行 时,它只请求我一个权限......随机三个之一。当我再次接受 READ_PHONE_STATE 权限时,需要重新启动应用程序以读取 phone 状态,特别是传入号码。

代码:

var permissions = cordova.plugins.permissions;
                var list = [
                permissions.READ_SMS,
                permissions.READ_PHONE_STATE,
                permissions.PROCESS_OUTGOING_CALLS
            ];
            permissions.hasPermission(list, checkPermissionCallback, null);
            function checkPermissionCallback(status) {
                if (!status.hasPermission) {

                    permissions.requestPermission(permissions.READ_PHONE_STATE, function (status) {
                        if (!status.hasPermission)
                            error1();
                    }, error1);
                    permissions.requestPermission(permissions.READ_SMS, function (status) {
                        if (!status.hasPermission)
                            error2();
                    }, error2);
                    permissions.requestPermission(permissions.PROCESS_OUTGOING_CALLS, function (status) {
                        if (!status.hasPermission)
                            error3();
                    }, error3);

                }
                function error1() {
                    console.warn('STATE permission is not turned on');
                }
                function error2() {
                    console.warn('SMS permission is not turned on');
                }
                function error3() {
                    console.warn('CALLS permission is not turned on');
                }
            }

提前致谢!

尝试Cordova diagnostic plugin

这个插件有一个 requestRuntimePermission()。来自 the docs:

requestRuntimePermissions(): Requests app to be granted authorisation for multiple runtime permissions.

示例:

cordova.plugins.diagnostic.requestRuntimePermissions(function(statuses){
    for (var permission in statuses){
        switch(statuses[permission]){
            case cordova.plugins.diagnostic.permissionStatus.GRANTED:
                console.log("Permission granted to use "+permission);
                break;
            case cordova.plugins.diagnostic.permissionStatus.NOT_REQUESTED:
                console.log("Permission to use "+permission+" has not been requested yet");
                break;
            case cordova.plugins.diagnostic.permissionStatus.DENIED:
                console.log("Permission denied to use "+permission+" - ask again?");
                break;
            case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
                console.log("Permission permanently denied to use "+permission+" - guess we won't be using it then!");
                break;
        }
    }
}, function(error){
    console.error("The following error occurred: "+error);
},[
    cordova.plugins.diagnostic.permission.ACCESS_FINE_LOCATION,
    cordova.plugins.diagnostic.permission.ACCESS_COARSE_LOCATION
]);

我制作了一个解决方案,适用于您要求的 cordova-plugin-android-permission。

解决方案目前是 AngularJS 使用 ES5 编写的,但可以将其重写为 typescript 或 ES6。当您需要一个或多个权限时调用此 promise 函数,当所有权限 been/already 已被接受时它 returns。

var getPermissions = function() {
  var defer = $q.defer();

  var permissions = cordova.plugins.permissions;

  var list = [
    permissions.CAMERA,
    permissions.RECORD_AUDIO,
    permissions.WRITE_EXTERNAL_STORAGE
  ];
  var acceptedCount = 0;

  list.forEach(element => {
    permissions.checkPermission(element, function(status) {
      if (status.hasPermission) {
        acceptedCount++;
        console.warn("getPermissions: checkPermission: Current acceptedCount: ", acceptedCount);
        if (acceptedCount === list.length) {
          console.warn("getPermissions: checkPermission: All permissions accepted - continue");
          defer.resolve();
        }
      } else permissions.requestPermission(element, function() {
        console.warn("getPermissions: requestPermission: All permissions accepted - continue");
        defer.resolve();
      }, null);
    }, null);
  });

  return defer.promise;
};

用 promise ES6 做出的解决方案:

checkAppPermissions: function () {
    return new Promise(function (resolve) {
        let permissions = cordova.plugins.permissions;
        let permissionList = [
            permissions.CAMERA,
            permissions.RECORD_AUDIO,
            permissions.WRITE_EXTERNAL_STORAGE
        ];
        let acceptedCount = 0;
        permissionList.forEach(perm => {
            permissions.checkPermission(perm, function (status) {
                if (status.hasPermission) {
                    acceptedCount++;
                    console.log('checkAppPermission: checkPermission: Current acceptedCount: ', acceptedCount);
                    if (acceptedCount === permissionList.length) {
                        console.log('checkAppPermission: checkPermission: All permissions accepted.');
                        resolve();
                    }
                } else permissions.requestPermission(perm, function () {
                    console.log('checkAppPermission: requestPermission: All permissions accepted.');
                    resolve();
                }, null);
            }, null);
        });
    });
},