Android权限处理分类

1、权限处理分类

img

由上图能够看出,主要分为四类。下表逐一介绍各种对应的一些状况。android

img

2、动态权限申请

虽然总的来讲分为四类,可是只须要处理一种状况,即动态申请权限。其余三种状况,要么默认实现,要么系统定制,没法从代码角度进行调整。那么下面先来看下那些权限须要动态申请。bash

(1)权限列表

img

Android6.0以上把权限分为普通权限和危险权限,因此危险权限是须要动态申请,给予用户提示的,而危险权限就是上表展现的内容。app

看到上面的 permissions,会发现一个问题,危险权限都是一组一组的。ide

分组对权限机制的申请是有必定影响的。例如app运行在android 6.x的机器上,对于受权机制是这样的。若是你申请某个危险的权限,假设你的app早已被用户受权了同一组的某个危险权限,那么系统会当即受权,而不须要用户去点击受权。好比你的app对READ_CONTACTS已经受权了,当你的app申请WRITE_CONTACTS时,系统会直接受权经过。ui

此外,对于申请时的弹窗上面的文本说明也是对整个权限组的说明,而不是单个权限。this

下面介绍下Android 6.0以上 动态申请权限所设计到的一些方法。spa

(2)权限申请方法

在申请权限先,首先要保证在AndroidManifest中写明须要的权限。 例如:设计

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

复制代码

具体权限方法详解:3d

img

权限申请示例

以获取定位权限为例。code

1.点击按钮,检查并申请权限

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (Build.VERSION.SDK_INT >23) {
                    if (ContextCompat.checkSelfPermission(MainActivity.this,
                             Manifest.permission.ACCESS_COARSE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED) {
                        //授予权限
                        getLoation();
                    }else{
                        //未得到权限
                        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}
                                ,REQUEST_CODE_LOCATION);
                    }
                }
            }
        });

复制代码

若是有权限,执行获取位置逻辑,若是没权限,则进行请求权限。

2.权限申请结果回调

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE_LOCATION)
        {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                getLoation();
            } else
            {
                if (shouldShowRequestPermissionRationale( Manifest.permission.ACCESS_COARSE_LOCATION)){
                    new AlertDialog.Builder(this)
                            .setMessage("申请定位权限,才能为你推送更准确的信息")
                            .setPositiveButton("肯定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //申请定位权限
                                    requestPermissions(MainActivity.this,
                                            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_LOCATION);
                                }
                            }).show();
                }
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

复制代码

若是赞成,执行获取位置逻辑,若是拒绝,重写shouldShowRequestPermissionRationale方法,返回true,向用户弹窗给出一个获取权限的提示,点击后再次申请权限。

public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {
        if (permission.equals(Manifest.permission.ACCESS_COARSE_LOCATION) ) {
            return true;
        } else {
            return super.shouldShowRequestPermissionRationale(permission);
        }
    }

复制代码

重写shouldShowRequestPermissionRationale,在申请位置权限时,返回true,给用户解释。

以上就是动态申请权限的逻辑,大概流程以下:

img

注意: shouldShowRequestPermissionRationale :默认状况下,不重写该方法,在Android原生系统中,若是第二次弹出权限申请的对话框,会出现“之后再也不弹出”的提示框,若是用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale返回true,意思是说要给用户一个 解释,告诉用户为何要这个权限。

相关文章
相关标签/搜索