Android 之动态权限的添加

       对于安卓 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();
    }
}

至此,运行时权限就大致讲解完了,有错误之处,希望各位大佬多多指教。

猜你喜欢

转载自blog.csdn.net/SophieBryant/article/details/82744692