–关于Android动态权限和targetSdkVersion背景:
targetSdkVersion:自2018年11月开始,GooglePlay以及国内大部分应用市场要求APP编译目标SDK必须为26及以上,否则不予提交审核;有许多已有APP转到APICloud开发后,因targetSdkVersion降级而导致无法覆盖安装;
动态权限:Android自系统6.0开始,提供动态权限机制,对于敏感权限(存储,定位,录音,拍照,录像等),需要在APP运行过程中动态向用户申请,这就和IOS系统的权限使用体验保持一致了(IOS一直以来就是动态权限)。
在Android上使用动态权限,要求APP编译的目标SDK(即targetSdkVersion)为23及以上(对应为android6.0及以上系统),22及以下系统会执行缺省处理(手机厂商也可能定制处理),APICloud为满足更普遍的开发需求,默认配置targetSdkVersion为22,即权限走系统缺省处理,如何开启动态权限,需要按照如下说明操作。
1、在res文件下创建manifest.xml文件,将其中的targetSdkVersion更新为目标值,例如28。
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<application name="targetSdkVersion" value="28"/>
</manifest>
2、将app代码中所有涉及到需要动态权限的操作,改造一遍 (例如进行拍照录制视频等需要使用摄像头,以前的缺省处理中不需要申请摄像头权限,而开启动态权限后,必须在进行拍照之前,判断是否有摄像头权限,没有则进行申请,只有用户同意了摄像头权限才能进行接下来拍照的操作);
opWithPermission('storage')
function hasPermission(one_per){
var perms = new Array();
if(one_per){
perms.push(one_per);
}else{
var prs = document.getElementsByName("p_list");
for(var i = 0; i < prs.length; i++){
if(prs[i].checked){
perms.push(prs[i].value);
}
}
}
var rets = api.hasPermission({
list:perms
});
if(!one_per){
$alert('判断结果:' + JSON.stringify(rets));
return;
}
return rets;
}
function reqPermission(one_per, callback){
var perms = new Array();
if(one_per){
perms.push(one_per);
}else{
var prs = document.getElementsByName("p_list_r");
for(var i = 0; i < prs.length; i++){
if(prs[i].checked){
perms.push(prs[i].value);
}
}
}
api.requestPermission({
list: ['storage','camera'],
code: 100001
}, function(ret, err){
if(callback){
callback(ret);
return;
}
var str = '请求结果:\n';
str += '请求码: ' + ret.code + '\n';
str += "是否勾选\"不再询问\"按钮: " + (ret.never ? '是' : '否') + '\n';
str += '请求结果: \n';
var list = ret.list;
for(var i in list){
str += list[i].name + '=' + list[i].granted + '\n';
}
//$alert(str);
console.log(JSON.stringify(ret));
});
}
function opWithPermission(perm){
if(!confirmPer(perm)){
return;
}
if('storage' == perm){
if(!confirmPer('camera')){
return;
}
}
}
function confirmPer(perm){
var has = hasPermission(perm);
if(perm=="camera"){
var permtext = '相机'
}
if(perm=="storage"){
var permtext = '存储'
}
if(!has || !has[0] || !has[0].granted){
// api.confirm({
// title: '提醒',
// msg: '没有获得 ' + permtext + " 权限\n是否前往设置?",
// buttons: ['去设置', '取消']
// }, function(ret, err) {
// if(1 == ret.buttonIndex){
// reqPermission(perm);
// }
// });
reqPermission(perm);
return false;
}
return true;
}