对于安卓 6.0 之前权限的处理是标胶简单的,只需要在清单文件中加入自己所需要的权限就可以了,但是随着谷歌对权限的审核变的严厉起来之后,在 targetSdkVersion 23 以上就需要动动态申请权限了,下面我就来介绍一下怎么动态申请权限,其中包括加入权限的逻辑和处理权限的逻辑,还有推荐的一些比较好用的库。
一: 添加权限的逻辑
1. 在你需要加入权限的地方请求权限,不是已进入到程序就全部请求一遍你所需要的权限,这样的会让用户很反感,得不到很好的用户体验,比如说 : 你在点击某个按钮的时候,需要加入扫描地址的权限,你就在这个点击事件的时候去对这个权限的加入,这样实现起来用户也知道他现在正在操作的是什么,用户体验比较到位。
2. 加入权限的时候一般分为如下的几个步骤:
(1) 权限的检查,先检查有没有你需要加入的权限,还有核对你核对版本是否是 6.0 以上还是 6.0 以下
(2) 加入权限之后的对话框处理, 如果用户点击允许添加权限,就直接给个简答你的吐司提示就好了,如果用户点击了拒绝添加权限,我也以一个点击事件举例说明的吧,用户拒绝了权限的添加,再次点击的时候,还是需要弹出权限的提示框,让用户去选择要添加的权限,如果用户再次点了对话框中的不在提示再次拒绝了权限的申请,用户再次点击功能按钮时,直接要跳到手机的设置界面,让用户强制打开权限,才能正常的使用该功能。
二:举例说明
安卓 6.0 以上的危险权限有:
申请运行时权限,我是使用了谷歌推出的 easypermissions ,此库功能还是比较齐全的,使用也比较简单,下面就针对这个库的使用来理解一下权限的添加
1. 依赖的添加
dependencies {
implementation 'pub.devrel:easypermissions:1.3.0'
}
2. 再在清单文件中声明要申请的危险权限,如果不声明的话,直接在代码中写也能申请成功,但是好想不会弹出询问框,直接就申请了。
3. 申请权限,可以直接申请
EasyPermissions.requestPermissions(
MainActivity.this,
"申请权限",
0,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO);
最好还是检查一下权限是否申请:
EasyPermissions.hasPermissions(Context context, @NonNull String… perms)方法来检测一个或者多个权限是否被允许,第二个参数是个可变数组,可以申请多个
String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION};
if (EasyPermissions.hasPermissions(this, perms)) {
// 已经申请过权限,做想做的事
} else {
// 没有申请过权限,现在去申请
EasyPermissions.requestPermissions(this, getString(R.string.camera_and_location_rationale),
RC_CAMERA_AND_LOCATION, perms);
4. 重写 onRequestPermissionsResult() 方法,把执行操作给 easyPermissions
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
5. 实现EasyPermissions.PermissionCallbacks接口,重写两个方法
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 把执行结果的操作给EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override //申请成功时调用
public void onPermissionsGranted(int requestCode, List<String> list) {
//请求成功执行相应的操作
比如,举个例子
switch (requestCode){
case 0:
Toast.makeText(this, "已获取WRITE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(this, "已获取WRITE_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
break;
}
}
@Override //申请失败时调用
public void onPermissionsDenied(int requestCode, List<String> list) {
// 请求失败,执行相应操作
}
}
6. 如果用户点了不在允许拒接了权限,那么就要重新这个方法 onPermissionsDenied
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
//处理权限名字字符串
StringBuffer sb = new StringBuffer();
for (String str : perms){
sb.append(str);
sb.append("\n");
}
sb.replace(sb.length() - 2,sb.length(),"");
switch (requestCode){
case 0:
Toast.makeText(this, "已拒绝权限" + perms.get(0), Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(this, "已拒绝WRITE_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限"+ perms.get(0), Toast.LENGTH_SHORT).show();
break;
}
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
Toast.makeText(this, "已拒绝权限" + sb + "并不再询问" , Toast.LENGTH_SHORT).show();
new AppSettingsDialog
.Builder(this)
.setRationale("此功能需要" + sb + "权限,否则无法正常使用,是否打开设置")
.setPositiveButton("是")
.setNegativeButton("否")
.build()
.show();
}
}
至此,运行时权限就大致讲解完了,有错误之处,希望各位大佬多多指教。