月度归档:2016年03月

Android权限和版本之间的关系

继续入坑,尝试切换运行时申请权限的时候,发现targetSdkVersion <= 22的时候,checkSelfPermission()都是返回GRANTED(已授权),即使你在设置里面关闭了权限。

使用checkSelfPermission()必须设置targetSdkVersion >= 23,但是权限太多、太乱,暂时放弃。

如果你使用targetSdkVersion <= 22,怎么判断用户关闭了权限?

PermissionChecker.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)

如果用户手动关闭了权限,在Andriod6.0上还可以继续请求权限

        CheckPermission
            .from(this)
            .setPermissions(dangerousPermission)
            .setRationaleConfirmText("Request ACCESS_COARSE_LOCATION")
            .setDeniedMsg("The ACCESS_COARSE_LOCATION Denied")
            .setPermissionListener(new PermissionListener() {
                @Override
                public void permissionGranted() {
                    ...
                }

                @Override
                public void permissionDenied() {
                    ...
                }
            })
            .check();

Android权限和版本之间

AndroidtargetSdkVersionContextPermissionCheckerActivity
checkSelfPrmsncheckSelfPrmsnrequestPrmsns
Android5.0 <= 22GRANTEDGRANTED
DENIED_APP_OP
no
Android5.0 >= 23DENIED
GRANTED
DENIED
GRANTED
no
Android6.0 <= 22GRANTEDGRANTED
DENIED_APP_OP
yes
Android6.0 >= 23DENIED
GRANTED
DENIED
GRANTED
yes

Android 6.0的运行时权限申请库

目标

1. 权限申请简单化
2. 不多写额外无用的代码
3. 支持特殊权限的处理:SYSTEM_ALERT_WINDOW,WRITE_SETTINGS

目前最符合1、2原则的开源库:PermissionsDispatcher,但是比较复杂。
参考和借用了一些开源库,整合一个GrantAndroidPermission库

运行时权限

参考之前的一篇博客:Android M(6.0) 权限爬坑之旅

添加依赖

repositories {
    maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
android {
    //需要设置为23,否则checkSelfPermission()方法无效
    targetSdkVersion 23
}
dependencies {
    compile compile 'com.github.captain-miao:grantap:1.0.2-SNAPSHOT'
}

Android权限申请

    String[] dangerousPermission = new String[]{
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.SYSTEM_ALERT_WINDOW,
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_SETTINGS};
    public void showRequestPermissionAccessCoarseLocation(View view) {
        CheckPermission
                .from(this)
                //申请权限列表
                .setPermissions(dangerousPermission)
                //权限说明,不设置的话不提示
                .setRationaleConfirmText("用户首次拒绝权限后,第二次请求权限应该解释下:为什么需要权限。")
                //权限拒绝后的说明,,不设置的话不提示
                .setDeniedMsg("用户拒绝权限,将影响什么功能")
                //权限申请完的回调,所有的都授权了才算Granted
                .setPermissionListener(new PermissionListener() {
                    @Override
                    public void permissionGranted() {
                        ...
                    }

                    @Override
                    public void permissionDenied() {
                        ...
                    }
                })
                //执行
                .check();

    }

源码

GitHub地址:Android_M_requestPermissions

感谢

* [TedPermission] – Easy check permission library for Android Marshmallow
* [PermissionGen] – Android API easy to use permission for Android M