告别权限申请乱象:PermissionsDispatcher让Android动态权限管理自动化
【免费下载链接】PermissionsDispatcher 项目地址: https://gitcode.com/gh_mirrors/pe/PermissionsDispatcher
你是否还在为Android权限申请编写大量重复代码?是否曾因权限被拒导致应用崩溃?本文将带你掌握PermissionsDispatcher的核心用法,通过注解驱动的方式,10分钟实现优雅的权限管理方案。读完本文你将获得:
- 动态权限申请的全流程自动化实现
- 特殊权限(如悬浮窗、系统设置)的处理技巧
- Kotlin/Java双语言集成方案
- 常见权限问题的解决方案
权限管理的前世今生
Android 6.0(API 23)引入动态权限机制后,开发者面临着新的挑战:需要在运行时向用户请求危险权限。传统手动实现方式存在代码冗余、状态管理复杂等问题。PermissionsDispatcher作为一款专注于权限管理的开源库,通过注解处理器自动生成权限处理代码,解决了这些痛点。
项目核心模块结构:
- 权限注解定义:annotation/src/main/java/permissions/dispatcher/
- 核心逻辑实现:library/src/main/java/permissions/dispatcher/
- 代码生成器:processor/src/kotlin/permissions/dispatcher/processor/
- 使用示例:sample/src/main/kotlin/permissions/dispatcher/sample/
快速集成:5分钟上手
基础配置
在app模块的build.gradle中添加依赖:
dependencies {
implementation "com.github.permissions-dispatcher:permissionsdispatcher:${latest.version}"
annotationProcessor "com.github.permissions-dispatcher:permissionsdispatcher-processor:${latest.version}"
}
Kotlin项目需使用kapt替代annotationProcessor:
apply plugin: 'kotlin-kapt'
dependencies {
implementation "com.github.permissions-dispatcher:permissionsdispatcher:${latest.version}"
kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:${latest.version}"
}
权限声明
在AndroidManifest.xml中声明所需权限:
<uses-permission android:name="android.permission.CAMERA" />
核心注解使用指南
PermissionsDispatcher提供简洁的注解API,仅需4个注解即可完成权限管理:
| 注解 | 必要性 | 描述 |
|---|---|---|
@RuntimePermissions | 必须 | 标记需要处理权限的Activity或Fragment |
@NeedsPermission | 必须 | 标记需要权限才能执行的方法 |
@OnShowRationale | 可选 | 解释为何需要该权限的方法 |
@OnPermissionDenied | 可选 | 权限被拒绝时调用的方法 |
@OnNeverAskAgain | 可选 | 用户选择"不再询问"时调用的方法 |
Kotlin实现示例
@RuntimePermissions
class MainActivity : AppCompatActivity(), View.OnClickListener {
@NeedsPermission(Manifest.permission.CAMERA)
fun showCamera() {
supportFragmentManager.beginTransaction()
.replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
.addToBackStack("camera")
.commitAllowingStateLoss()
}
@OnShowRationale(Manifest.permission.CAMERA)
fun showRationaleForCamera(request: PermissionRequest) {
showRationaleDialog(R.string.permission_camera_rationale, request)
}
@OnPermissionDenied(Manifest.permission.CAMERA)
fun onCameraDenied() {
Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show()
}
@OnNeverAskAgain(Manifest.permission.CAMERA)
fun onCameraNeverAskAgain() {
Toast.makeText(this, R.string.permission_camera_never_askagain, Toast.LENGTH_SHORT).show()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById(R.id.button_camera).setOnClickListener {
// 委托权限处理给生成的函数
showCameraWithPermissionCheck()
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// 委托结果处理给生成的函数
onRequestPermissionsResult(requestCode, grantResults)
}
}
布局文件示例:sample/src/main/res/layout/activity_main.xml
特殊权限处理方案
某些系统权限如悬浮窗(SYSTEM_ALERT_WINDOW)和写入系统设置(WRITE_SETTINGS)需要特殊处理。PermissionsDispatcher对此提供了完整支持。
悬浮窗权限实现
在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Java实现示例:
@RuntimePermissions
public class SystemAlertWindowActivity extends AppCompatActivity {
@NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)
void showSystemAlertWindow() {
// 显示悬浮窗逻辑
WindowManager windowManager = getWindowManager();
// ...实现代码
}
@OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)
void showRationaleForSystemAlertWindow(PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage("需要悬浮窗权限以显示通知")
.setPositiveButton("确定", (dialog, which) -> request.proceed())
.setNegativeButton("取消", (dialog, which) -> request.cancel())
.show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_special_permission);
findViewById(R.id.btn_show_float_window).setOnClickListener(v ->
SystemAlertWindowActivityPermissionsDispatcher.showSystemAlertWindowWithPermissionCheck(this));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 特殊权限需要在onActivityResult中处理
SystemAlertWindowActivityPermissionsDispatcher.onActivityResult(this, requestCode);
}
}
完整实现参考:test/src/main/java/permissions/dispatcher/test/ActivityWithSystemAlertWindow.java
高级应用场景
Kotlin扩展函数
PermissionsDispatcher提供了Kotlin扩展模块,进一步简化使用:
// 使用Ktx扩展
val permissionsRequester = PermissionsRequester(
this,
Manifest.permission.CAMERA
) { showCamera() }
button_camera.setOnClickListener {
permissionsRequester.launch()
}
Kotlin扩展实现源码:ktx/src/main/java/permissions/dispatcher/ktx/PermissionsRequester.kt
权限请求流程图
常见问题解决方案
权限冲突处理
当多个功能需要同一权限时,PermissionsDispatcher会自动合并请求,避免重复申请。详细处理逻辑见:PermissionUtils.java
适配不同Android版本
通过maxSdkVersion属性控制权限申请的版本范围:
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
详细说明:doc/maxsdkversion.md
迁移指南
从jCenter迁移到MavenCentral的步骤:doc/migration_guide.md
总结与展望
PermissionsDispatcher通过注解驱动的方式,极大简化了Android权限管理流程,主要优势包括:
- 代码自动生成,减少手动编写重复代码
- 支持Kotlin/Java双语言
- 完整覆盖普通权限和特殊权限
- 提供权限 rationale 说明机制
- 处理权限被拒和"不再询问"场景
项目持续维护中,最新特性和版本更新请关注:CHANGELOG.md
掌握PermissionsDispatcher,让你的应用权限管理既规范又高效,为用户提供更流畅的体验。现在就集成到你的项目中,体验自动化权限管理的便利吧!
本文示例代码基于PermissionsDispatcher最新版本,完整示例可参考:sample/ 和 ktx-sample/
【免费下载链接】PermissionsDispatcher 项目地址: https://gitcode.com/gh_mirrors/pe/PermissionsDispatcher
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



