android程序员的职业规划

android 批量申请权限

2019-02-20  本文已影响257人  android_haihong

Android开发时,到6.0系统上之后,有的权限就得申请才能用了。
Android将权限分为正常权限 和 危险权限
详细可参考: (https://www.cnblogs.com/liuzhipenglove/p/7102692.html)

网上也有很多参考例子,我这里总结下我的理解和用法
我们知道在Android6.0(SDK等级是23)以后有些权限是需要动态申请的
然后这里主要记录下如何同时动态申请多个权限

我申请的权限有三个:READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,CAMERA,分别是读,写,还有相机权限, INTERNET的话我发现静态注册也是可以的,当然以防万一也可以加上.然后就是虽然是动态申请,但是还是需要在AndroidManifest.xml文件中进行静态申请的:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>

然后是动态权限申请
<1>首先声明一个数组permissions,将所有需要申请的权限都放在里面

//1、首先声明一个数组permissions,将所有需要申请的权限都放在里面
String[] permissions = new String[]{
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};

<2>创建一个mPermissionList,逐个判断哪些权限未授权,将未授权的权限存储到mPermissionList中

// 声明一个集合,用来存储用户拒绝授权的权
List<String> mPermissionList = new ArrayList<>();

<3>声明一个请求码,在请求权限的回调方法onRequestPermissionsResult中需要判断使用

//10000比较霸气
private static final int MY_PERMISSIONS_REQUEST_CODE = 10000;

<4>进行权限判断和申请

private void getPermissions() {
    mPermissionList.clear();                                    //清空已经允许的没有通过的权限
    for (int i = 0; i < permissions.length; i++) {          //逐个判断是否还有未通过的权限
        if (ContextCompat.checkSelfPermission(MainActivity.this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
            mPermissionList.add(permissions[i]);
        }
    }

    if (mPermissionList.size() > 0) {                           //有权限没有通过,需要申请
        ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST_CODE);
    } else {
        Log.e("getPermissions() >>>", "已经授权");     //权限已经都通过了
    }
}

<5>请求权限后回调的方法,在权限请求完成后做个判断,是否完成了所有权限的申请,

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    boolean hasPermissionDismiss = false;      //有权限没有通过
    if (MY_PERMISSIONS_REQUEST_CODE == requestCode) {
        for (int i = 0; i < grantResults.length; i++) {
            if (grantResults[i] == -1) {
                hasPermissionDismiss = true;   //发现有未通过权限
                break;
             }
        }
    }

    if (hasPermissionDismiss) {                //如果有没有被允许的权限
        //假如存在有没被允许的权限,可提示用户手动设置 或者不让用户继续操作
    } else {
        Log.e("onRequestPermissionsResult >>>", "已全部授权");
    }
}

还有记录一个坑


image.png

如果你的gradle文件中
targetSdkVersion 参数设置成了21的话 等于是用6.0以前的版本运行,这样的话有可能导致无法动态申请权限,这点需要特别注意下

如若有补充,留言区留下你的宝贵意见,谢谢!!!

上一篇下一篇

猜你喜欢

热点阅读