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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。