targetSdkVersion适配设置背景
1、谷歌发布的Android P版本对TargetSdkVersion参数提出了要求: P 版本中应用设置的TargetSdkVersion需要>=26,否则将弹出警告对话框来提示用户,并且谷歌有明确的CDD要求,该提示无法去除。
2、2018年7月18日上午,电信终端产业协会(TAF)发布《移动应用软件高API等级预置与分发自律公约》(以下简称《公约》)。OPPO、华为、百度、360、阿里、小米、VIVO、腾讯作为发起单位,共同签署《公约》并发出联合倡议:号召广大移动应用软件预置与分发服务提供者,拒绝上架并及时更新低API等级的应用,共同维护用户权益。《公约》规定,自2019年5月1日起,新上架和预置应用应基于Android 8.0 (API等级26)及以上开发。自2019年8月1日起,现有应用的更新应基于Android 8.0 (API等级26)及以上开发。
API等级较低(TargetSdkVersion<26)的应用存在什么问题?
一是在权限管理方面存在用户可知而不可控的问题;
二是存在可规避系统安全机制的漏洞,容易造成用户个人信息泄漏,引发大量终端安全和个人信息保护风险。
坚持不改API等级,会有什么后果?
国内各大android应用市场,上传或更新自家APP版本时会被拒绝审核,提示“安装包的API等级(targetSdkVersion)必须等于或高于26,请重新打包上传”
怎么更改targetSdkVersion>=26适配设置?
1、下载附件中的manifest.xml,将其中的targetSdkVersion更新为目标值,例如26;
2、将manifest.xml置于你的/项目代码/res/目录下(widget/res/manifest.xml);
3、将你的app代码中所有涉及到需要动态权限的操作,按照附件中的代码,改造一遍;
4、提交代码;
5、云编译界面勾选APP所需的权限;
6、使用升级环境编译 即可。
注意:当你设置的targetSdkVersion大于等于23时,即开启了动态权限,如果你的APP带有获取IMEI,定位,录音,拍照,录像等敏感功能时(所有权限见文档),必须使用动态权限机制,先判断是否具有该功能操作权限,再进行操作,如果不具备相应的权限,对应的功能是失效的,也可能导致APP崩溃。
为保证动态权限尽可能适配更多厂商的手机以及顺利上线Google Play,targetSdkVersion目前推荐设置为26.
补充:当你设置的targetSdkVersion大于等于23时,如果是编译自定义loader,安装到手机后,需要先在设置中给应用打开存储空间权限。否则,WiFi同步后,loader无法正常加载代码。
怎么配置动态权限?
apicloud统一了Android和IOS两个平台的动态权限操作,提供两个API:hasPermission | requestPermission
封装了动态权限方法,完整源码如下:
// app动态权限控制 // perm_: 请求单个或多个权限(逗号分隔) // opts_.callback: 请求的权限已全部允许,执行回调 function confirmPermission (perm_,opts_) { var permArr=perm_.split(','); var hasPerm=api.hasPermission({ list:permArr }); console.log('hasPerm:'+JSON.stringify(hasPerm)); var allGranted=true;//申请的权限是否全部已打开 for (var i = 0; i < hasPerm.length; i++) { if(!hasPerm[i].granted){ allGranted=false; // api.confirm({ // title: '提醒', // msg: '没有获得 ' + permTxt[hasPerm[i]['name']] + " 权限\n是否前往设置?", // buttons: ['去设置', '取消'] // }, function(ret, err) { // if(1 == ret.buttonIndex){ // } // }); } } if(!allGranted){ var permTxt={ 'camera':'相机/拍照/录像', 'contacts':'联系人读取/写入', 'microphone':'麦克风', 'photos':'相册', 'location':'定位', 'locationAlways':'后台定位,只支持iOS', 'notification':'状态栏通知', 'calendar':'日历读取/写入。只支持Android', 'phone':'手机识别码', 'storage':'本地存储' }; api.requestPermission({ list:permArr },function(ret,err){ console.log(JSON.stringify(ret)) var list=ret.list, curName=''; for (var i in list) { if(!list[i].granted){ curName=list[i].name; setTimeout(function(){ api.toast({ msg: '获取"'+permTxt[curName]+'"权限被拒,对应功能无法正常使用!', duration: 60000, location: 'middle', global:true }); },0) break; }else if(i==list.length-1){ console.log('用户允许获得权限'); // 请求的权限已全部允许,执行回调 opts_ && opts_.callback(); } } }) }else{ console.log('请求的权限已全部打开'); // 请求的权限已全部打开,执行回调 opts_ && opts_.callback(); } }
调用方法示例:
confirmPermission('storage',{ callback:function(){ console.log('storage本地存储权限已获取!'); } })
另外,权限请求弹窗中,如果勾选了“禁止后不再询问”,后面再请求同一权限时会自动打开应用权限的“单项权限设置”这一二级设置界面。
参考链接
https://www.taf.net.cn/News_detail.aspx?_NOTICE_ID=231
https://dev.mi.com/console/doc/detail?pId=1696
https://community.apicloud.com/bbs/thread-110959-1-1.html
2条评论( 网友:2 条,站长:0 条 ) 网友评论{有您的评论更精彩....}