Android6.0 之后某些权限需要动态申请,相比于之前版本复杂了许多。不过已经有大神给我们写好了框架(PermissionsDispatcher),我们用起来还是很方便。
1、添加引用
根据 gradle 版本进行如下配置:
如果 Android Gradle Plugin >=2.2
在 app 模块下的 build.gradle
添加下面的配置:
compile 'com.github.hotchemi:permissionsdispatcher:2.3.2'
annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.2'
Android Gradle Plugin <2.2
需要额外在项目层级下的 build.gradle
添加下面配置:
buildscript { dependencies { classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } }
2、使用 五种注解(注解的方法不能是private)
注解 | 是否必须 | 描述 |
@RuntimePermissions | ✓ | 注册一个 Activity 或 Fragment 用于处理权限 |
@NeedsPermission | ✓ | 注解一个方法,说明需要什么权限(一个或多个) |
@OnShowRationale | 注解一个方法,解释为什么需要这些权限 | |
@OnPermissionDenied | 注解一个方法,当用户拒绝授权时将调用该方法 | |
@OnNeverAskAgain | 注解一个方法,当用户选择了 "不再提醒" 将调用该方法 |
示例代码
@RuntimePermissions public class MainActivity extends AppCompatActivity { // 单个权限 // @NeedsPermission(Manifest.permission.CAMERA) // 多个权限 @NeedsPermission({ Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO }) void showCamera() { getSupportFragmentManager().beginTransaction() .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance()) .addToBackStack("camera") .commitAllowingStateLoss(); } // 向用户说明为什么需要这些权限(可选) @OnShowRationale(Manifest.permission.CAMERA) void showRationaleForCamera(final PermissionRequest request) { new AlertDialog.Builder(this) .setMessage(R.string.permission_camera_rationale) .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed()) .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel()) .show(); } // 用户拒绝授权回调(可选) @OnPermissionDenied(Manifest.permission.CAMERA) void showDeniedForCamera() { Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show(); } // 用户勾选了“不再提醒”时调用(可选) @OnNeverAskAgain(Manifest.permission.CAMERA) void showNeverAskForCamera() { Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show(); } } 作者:linchaolong 链接:http://www.jianshu.com/p/64e7334cde11 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。