Reputation: 35
I need a way to request all permissions at the same time as runtime.
I'm using this plugin https://github.com/NeoLSN/cordova-plugin-android-permissions, but when run the app is running it request me only one permission...one of three at random. And again when I accept the READ_PHONE_STATE permission it is required to restart application for read phone state, in particular incoming number.
The code:
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');
}
}
Thanks all in advance!
Upvotes: 2
Views: 3629
Reputation: 1
The solutions made with 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);
});
});
},
Upvotes: 0
Reputation: 1144
I made a solution that works with the cordova-plugin-android-permission you asked for.
The solutions is currently made with AngularJS using ES5, but it can be rewritten to typescript or ES6. You call this promise function when you need one or more permissions and it returns when all permissions have been/already have been accepted.
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;
};
Upvotes: 0
Reputation: 16365
Try Cordova diagnostic plugin.
This plugin has a requestRuntimePermission()
. From the docs:
requestRuntimePermissions(): Requests app to be granted authorisation for multiple runtime permissions.
Example:
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
]);
Upvotes: 1