Android6.0动态运行权限简单明了版

首先我们为什么要用这个6.0的权限,因为时代在进步嘛,要不谁用它啊,
直接把那个目标版本变成23以下不就好啦,但是身为一个优秀的Android高级开发工程师,

    肯定得用最新的是吧,废话不多说,我来给大家讲解一下鄙人的自我见解。有意见可以提,但是不好使!


Android6.0这个新的动态运行权限
  • 将权限分为一般权限和危险权限两种,一般权限跟以前一样在AndroidManifest声明,危险权限需要开发者在代码中手动的动态申请
  • 动态申请权限,系统弹出对话框,用户可点击确定或拒绝,系统提供用户的选择回调,从而开发者处理相应的逻辑
  • 用户可以选择拒绝并不再提醒
危险权限分为9种
身体传感器,日历,摄像头,通讯录,地理位置,麦克风,电话,短信,存储空间

android系统分为原生系统(谷歌公司做的系统-—— google nexus)和第三方厂商定制系统(rom)
暂时不做运行时权限适配的方案(不推荐)
如果暂时还不想适配6.0运行时权限,但是又想要app可以在6.0及以上机型运行,那我们可以将目标版本改为23以下,如: targetSdkVersion 22 ,最好使用最高的版本也就是22
  • 不管是6.0以下还是以上的机型都可以运行,跟之前一样权限在安装时一次性授予
  • 由于6.0机型在设置中可以进行权限管理,用户可以取消该应用的某个权限,但是app并不知道该权限被取消,此时app会崩溃(合理的try可以避免)
目前最流行的运行时权限请求框架PermissionsDispatcher、RxPermissions和easypermissions的使用和对比(建议使用easypermissions这个)

下面就是我自己写的一个小demo

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
    private static final int CALL_PHONE_REQUEST_CODE = 100; //打电话权限的请求码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                initData();
            }
        });
    }

    private void initData() {
        if (Build.VERSION.SDK_INT >= 23) {
            //打电话的权限
            String[] mPermissionList = new String[]{Manifest.permission.CALL_PHONE};
            if (EasyPermissions.hasPermissions(MainActivity.this, mPermissionList)) {
                //已经同意过

            } else {
              /*  EasyPermissions.requestPermissions():
                第一个参数:Context对象
                第二个参数:权限弹窗上的文字提示语。告诉用户,这个权限用途。
                第三个参数:这次请求权限的唯一标示,code。
                第四个参数 : 一些系列的权限。*/
                //未同意过,或者说是拒绝了,再次申请权限
                EasyPermissions.requestPermissions(
                        this,  //上下文
                        "没有这个权限程序无法运行", //提示文言
                        CALL_PHONE_REQUEST_CODE, //请求码
                        mPermissionList //权限列表
                );
            }
        } else {
            //6.0以下,不需要授权

        }

    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //将请求结果传递EasyPermission库处理
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }


    @Override
    public void onPermissionsGranted(int requestCode, List list) {

    }

    //拒绝授权
    @Override
    public void onPermissionsDenied(int requestCode, List perms) {

        Toast.makeText(MainActivity.this,"用户授权失败",Toast.LENGTH_SHORT).show();
        //如果用户点击拒绝授权并且点击不在提醒,这时候会进入那个设置的 页面,让用户手动开启权限
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            new AppSettingsDialog.Builder(this).build().show();
        }
    }

}

你可能感兴趣的:(Android6.0动态运行权限简单明了版)