告别权限申请模板代码:Android Studio中PermissionsDispatcher的5分钟上手指南
【免费下载链接】PermissionsDispatcher 项目地址: https://gitcode.com/gh_mirrors/pe/PermissionsDispatcher
Android应用开发中,权限管理(Permission Management)是绕不开的环节。每次添加新权限都要重复编写检查逻辑、用户提示、结果处理等模板代码,不仅效率低下还容易出错。本文将介绍如何使用PermissionsDispatcher库自动生成标准化的权限处理代码,配合Android Studio实现一键集成,让你彻底摆脱重复劳动。
为什么需要权限管理库?
Android 6.0(API 23)引入运行时权限(Runtime Permissions)机制后,应用需要在使用危险权限时动态申请。原生API要求开发者处理权限检查、用户授权、拒绝处理等多个场景,典型流程包含:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
} else {
// 权限已授予,执行操作
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户同意授权
} else {
// 用户拒绝授权
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// 用户选择"不再询问"
}
}
}
}
这段代码仅处理了单一权限的基本场景,实际开发中还需要考虑多权限组合、权限说明弹窗、配置变更等复杂情况。PermissionsDispatcher通过注解处理器(Annotation Processor)自动生成上述模板代码,开发者只需关注核心业务逻辑。
快速集成PermissionsDispatcher
1. 添加依赖
在项目级build.gradle中添加Maven仓库(已包含在Android Studio默认配置中),在模块级build.gradle添加以下依赖:
dependencies {
implementation 'com.github.hotchemi:permissionsdispatcher:4.8.0'
annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:4.8.0'
}
对于Kotlin项目,使用kapt替代annotationProcessor:
dependencies {
implementation 'com.github.hotchemi:permissionsdispatcher:4.8.0'
kapt 'com.github.hotchemi:permissionsdispatcher-processor:4.8.0'
}
2. 基础注解说明
PermissionsDispatcher提供5个核心注解,覆盖权限管理全流程:
| 注解 | 作用 | 是否必须 |
|---|---|---|
@RuntimePermissions | 标记需要处理权限的Activity/Fragment | ✅ |
@NeedsPermission | 标记需要权限才能执行的方法 | ✅ |
@OnShowRationale | 解释权限用途的回调(可选) | ❌ |
@OnPermissionDenied | 权限被拒绝的回调(可选) | ❌ |
@OnNeverAskAgain | 用户选择"不再询问"的回调(可选) | ❌ |
完整注解说明可参考官方文档:doc/java_usage.md
Java实现示例:相机权限申请
以相机权限(CAMERA)为例,完整实现只需3步:
1. 声明权限
在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.CAMERA" />
2. 编写业务代码
使用PermissionsDispatcher注解标记权限相关方法:
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button_camera).setOnClickListener(v -> {
// 调用生成的权限检查方法
MainActivityPermissionsDispatcher.showCameraWithPermissionCheck(this);
});
}
// 需要相机权限的方法
@NeedsPermission(Manifest.permission.CAMERA)
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("需要相机权限才能拍照")
.setPositiveButton("允许", (dialog, button) -> request.proceed())
.setNegativeButton("拒绝", (dialog, button) -> request.cancel())
.show();
}
// 权限被拒绝
@OnPermissionDenied(Manifest.permission.CAMERA)
void showDeniedForCamera() {
Toast.makeText(this, "相机权限被拒绝", Toast.LENGTH_SHORT).show();
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 委托给生成的方法处理结果
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
}
完整代码参考:sample/src/main/kotlin/permissions/dispatcher/sample/MainActivity.kt
3. 编译生成辅助类
Make Project(Ctrl+F9)后,PermissionsDispatcher会自动生成MainActivityPermissionsDispatcher类,包含所有权限处理逻辑。无需手动修改该类,后续代码变更会自动同步更新。
Kotlin扩展:更简洁的权限请求
PermissionsDispatcher提供Kotlin扩展库(KTX),通过DSL风格API进一步简化代码:
class MainFragment : Fragment() {
private val cameraRequester by constructPermissionsRequest(
Manifest.permission.CAMERA,
onShowRationale = { request ->
AlertDialog.Builder(requireContext())
.setMessage("需要相机权限才能拍照")
.setPositiveButton("允许") { _, _ -> request.proceed() }
.setNegativeButton("拒绝") { _, _ -> request.cancel() }
.show()
},
onPermissionDenied = {
Toast.makeText(requireContext(), "相机权限被拒绝", Toast.LENGTH_SHORT).show()
},
requiresPermission = { openCamera() }
)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<Button>(R.id.button_camera).setOnClickListener {
cameraRequester.launch()
}
}
private fun openCamera() {
// 打开相机逻辑
}
}
KTX版本通过属性委托(by constructPermissionsRequest)消除了模板代码,更符合Kotlin语法习惯。完整示例见:ktx-sample/src/main/java/permissions/dispatcher/ktx/sample/MainFragment.kt
常见问题与解决方案
1. 多权限组合申请
同时申请多个权限只需在注解中添加数组参数:
@NeedsPermission({Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS})
void accessContacts() {
// 访问联系人逻辑
}
2. 特殊权限处理
系统级权限(如SYSTEM_ALERT_WINDOW、WRITE_SETTINGS)需要特殊处理,PermissionsDispatcher提供专用辅助类:
@NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)
void showOverlay() {
// 显示悬浮窗逻辑
}
详细说明参考:doc/special_permissions.md
3. 代码检查与Lint支持
PermissionsDispatcher包含Lint规则,可在编译时检测常见错误,如:
- 忘记重写
onRequestPermissionsResult @NeedsPermission方法为private- 权限回调方法参数错误
Lint规则实现见:lint/src/main/java/permissions/dispatcher/
进阶技巧:自定义代码模板
为进一步提升效率,可在Android Studio中创建Live Template:
- 打开
File > Settings > Editor > Live Templates - 新建模板组(如
PermissionsDispatcher) - 添加模板代码:
@RuntimePermissions
public class $CLASS_NAME$ extends $SUPERCLASS$ {
@NeedsPermission($PERMISSION$)
void $METHOD_NAME$() {
$END$
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
$CLASS_NAME$PermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
}
配置变量和适用范围后,即可通过快捷键快速生成基础代码框架。
总结
PermissionsDispatcher通过注解处理器自动生成标准化的权限管理代码,核心优势包括:
- 减少模板代码:无需手动编写权限检查和结果处理逻辑
- 提高代码质量:统一权限处理流程,避免遗漏边缘场景
- 支持Java/Kotlin:提供两种语言的最佳实践实现
- 活跃维护:持续跟进Android系统权限机制更新
项目地址:gh_mirrors/pe/PermissionsDispatcher
掌握PermissionsDispatcher后,你可以将更多精力投入到业务逻辑实现,而非重复的权限处理代码中。现在就集成到你的项目中,体验自动化权限管理的便捷吧!
【免费下载链接】PermissionsDispatcher 项目地址: https://gitcode.com/gh_mirrors/pe/PermissionsDispatcher
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



