读写权限(WRITE_EXTERNAL_STORAGE)在sdk 23之前,只需要在AndroidManifest.xml中添加响应权限即可。但是sdk 23以及大于23的版本时,需要在activity中动态授权。
1. 用法
在activity类中调用授权方法requestPermissions
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},123);
调用这个方法之后,用户界面会弹出以下对话框
image.png
大家肯定很熟悉这个界面了,用户点击允许后,就可以正常读写sd卡了。
当然,也需要在AndroidManifest.xml中添加权限。AndroidManifest.xml文件和activity中调用,两者缺一不可。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果只是想知道如何使用的童鞋,看到这就够了,下文请忽视~
2. 方法解释
requestPermissions接受两个参数,第一个参数类型是String[],String数组存的是需要授权的权限列表,第二个参数是requestCode,是一个自定义的请求码。这个请求码需要搭配onRequestPermissionsResult方法使用。
image.png
用户点击后,结果会通过这个方法通知开发者,开发者可以自定义处理逻辑。
checkSelfPermission方式用于判断用户是否有权限,checkSelfPermission接受一个String类型参数——用户权限,这个参数Google官方已经有常量表示,例如:Manifest.permission.WRITE_EXTERNAL_STORAGE。
返回值是int类型,其中-1表示用户没有获得此权限,0表示已经获得此权限,返回值也有常量表示,例如:PackageManager.PERMISSION_DENIED。
3. 用户选择不同选项之后的,对应手机权限的变化
在弹出对话框后,因为并不是所有的用户都会选择“允许”,根据用户的选择,app获得的权限也会不同。下面分析在用户的各种操作下,app权限的变化。本人亲测,直接上截图如下:
image.png
image.png
image.png
image.png
image.png
图片中说明列举了app权限和用户操作的关系。app权限中,“?”表示访问,"x"表示拒绝,“√”表示允许。下面在用表格简单说明:
操作 | 没有动态授权前 | 允许 | 第1次拒绝 | 第n次拒绝(n>1) |
---|---|---|---|---|
勾选“不再询问” | 访问 | 允许 | 访问 | 拒绝 |
不勾选“不再询问” | 访问 | 允许 | 访问 | 访问 |
注:当状态为允许或拒绝时,即使调用请求权限的方法requestPermissions,也不会弹出对话框。所以大家不用担心允许后还会弹出的问题,但是需要注意,如果用户勾选了“不在询问”后,也不会弹出,所以需要考虑这个因素并做处理。这里给出一个参数做法,用checkSelfPermission方法判断是否有权限,如果返回-1,即没有权限,那么先调用自定义弹出框,提示用户必须允许,才能使用xxx功能,如果这个功能确实是用户需要用到的,那用户就没有理由拒绝了。
另外,不管在任何时候,任何状态下,用户都可以在设置中,找到应用权限设置,手动更改权限。
4. 总结
在sdk 23之前(不包括23),只需要在AndroidManifest.xml中添加响应权限即可。但是sdk 23以及大于23的版本,用户权限分成四种:
normal:普通权限,只需在AndroidManifest.xml中声明即可调用
dangerous :危险权限,需在AndroidManifest.xml中声明,并且在某一个activity中调用requestPermissions动态请求权限。
signature :是指具有相同签名的App可以访问和共享此App。本文不作讨论。
signatureOrSystem :是指系统image中App和具有相同签名的App可以访问和共享此App。本文不作讨论。
requestPermissions用于动态请求权限,checkSelfPermission用于判断是否拥有权限。
网友评论