一、权限申请的相关事宜
1、应当首先在应用清单( AndroidManifest.xml)中添加 <uses-permission android:name=android.permission.SEND_SMS>
2、普通权限系统会直接给予,危险权限会事先询问用户
3、硬件声明可以添加<uses-feature android:name = android.hardware.camera android:required = false />
4、尽管用户在应用中同意给予权限,但用户随时可以撤销给予的权限
二、权限申请的过程
1、权限声明
2、权限可用性判断
a、使用ContextCompat.checkSelfPermission()来进行权限查询,根据是否拥有权限返回PackageManager.PERMISSION_DENIED 或Package.PERMISSION_GRANTED (-1或0)
b、使用getPackageManager().hasSystemFeature()来进行硬件可用性查询,根据设备是否拥有该硬件来返回布尔值
3、权限申请
a、使用shouldShowRequestPermissionRationale()来判断是否需要向用户解释权限申请原因,返回true即是需要
请求了但是被拒绝了,此时返回true,意思是你该向用户好好解释下了
请求被允许了,都给你权限了,还解释个啥,故返回false
请求权限被禁止了,也不给你弹窗提醒了,连申请的机会都没有了,所以不用解释了,故返回fasle
b、使用ActivityCompat.requestPermissions()申请权限,需要申请的权限以string数组的形式输入,并填写回调码
这个函数会回调onRequestPermissionsResult函数,使用回调码来判断如何调用这个函数
c、重写回调函数onRequestPermissionsResult
三、权限申请函数封装
1、定义了两个List,分别存储没有但还能够申请的权限(用户没有设定不弹窗)和没有的权限且无法申请(用户设定了不再弹窗)
2、使用checkSelfPermission方法判断是否拥有权限,使用shouldShowRequestPermissionRationale方法来判断权限是否还能够申请,根据判断结果分别存储
这里的checkSelfPermission方法可能受到手机影响结果不同,华为mate系列安卓10实体机会把已经赋予的短信权限判断为不拥有,但是可以正常使用权限
3、判断存储没有但还能够申请的权限List,若其中有内容(长度大于0)则弹窗提示需要权限并申请,无法再申请的权限不予申请
4、对于无法申请的权限之前的做法是如果存在这样的权限则弹窗提示用户并直接退出程序,但因为上面的检查结果根据机型存在结果差异,所以这里的弹窗修改到后续用到权限时的异常处理中,如下图





