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');
}
}
提前致谢!
这个插件有一个 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);
});
});
},
我需要一种在运行时间同时请求所有权限的方法。
我正在使用这个插件 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');
}
}
提前致谢!
这个插件有一个 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);
});
});
},