Android 6.0+ 动态权限处理


之前一直没有详细全面的了解整个android6.0之后权限的划分和处理,今天抽出些时间整理一下

首先需要了解一下6.0以后权限的分类,分为普通权限和危险权限,普通权限不用说,只需要在清单文件中进行配置即可;对于危险权限就需要我们去动态配置了,如果不进行配置,就会出现崩溃,下面是危险权限


如果是同一组的权限不用重复授权,也就是说,同一组的权限只要有一个授权了,那么同一组的其它权限也都就授权了

那么危险权限我们已经了解了,下一步如何配置呢

首先需要在清单文件中声明我们需要的应用权限,然后就是在需要申请权限的地方进行动态的配置了,以下是详细的配置过程,咱们以获取相机权限为例,首先需要保证您的手机是android6.0以上,同时项目的targetSdkVersion的版本在23以上

首先在清单文件中注册

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

然后就是动态的配置,下边是封装的BaseActivity

/**
 * 封装动态权限
 */
public class BaseActivity extends AppCompatActivity{

    private PermissionListener mListener;
    private static final int PERMISSION_REQUESTCODE = 100;

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);

    }

    public void requestRunPermisssion(String[] permissions, PermissionListener listener){
        mListener = listener;
        List<String> permissionLists = new ArrayList<>();
        for(String permission : permissions){
            if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                permissionLists.add(permission);
            }
        }

        if(!permissionLists.isEmpty()){
            ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
        }else{
            //表示全都授权了
            mListener.onGranted();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case PERMISSION_REQUESTCODE:
                if(grantResults.length > 0){
                    //存放没授权的权限
                    List<String> deniedPermissions = new ArrayList<>();
                    for(int i = 0; i < grantResults.length; i++){
                        int grantResult = grantResults[i];
                        String permission = permissions[i];
                        if(grantResult != PackageManager.PERMISSION_GRANTED){
                            deniedPermissions.add(permission);
                        }
                    }
                    if(deniedPermissions.isEmpty()){
                        //说明都授权了
                        mListener.onGranted();
                    }else{
                        mListener.onDenied(deniedPermissions);
                    }
                }
                break;
            default:
                break;
        }
    }
}

调用的地方只需要这样写

initPermission();

private void initPermission() {
        requestRunPermisssion(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CHANGE_WIFI_STATE}, new PermissionListener() {
            @Override
            public void onGranted() {
                Toast.makeText(MyMemoryActivity.this, "授权通过", Toast.LENGTH_SHORT).show();
                init();
                initLocation();
            }

            @Override
            public void onDenied(List<String> deniedPermission) {
                for(String permission : deniedPermission){
                    Toast.makeText(MyMemoryActivity.this, "权限被拒绝:" + permission, Toast.LENGTH_SHORT).show();
                }
            }
        });
}
以上就是我整理的内容,仅限参考
            </div>

猜你喜欢

转载自blog.csdn.net/yzj_0722/article/details/80280401