告别权限申请乱象:PermissionsDispatcher让Android动态权限管理自动化

告别权限申请乱象:PermissionsDispatcher让Android动态权限管理自动化

【免费下载链接】PermissionsDispatcher 【免费下载链接】PermissionsDispatcher 项目地址: https://gitcode.com/gh_mirrors/pe/PermissionsDispatcher

你是否还在为Android权限申请编写大量重复代码?是否曾因权限被拒导致应用崩溃?本文将带你掌握PermissionsDispatcher的核心用法,通过注解驱动的方式,10分钟实现优雅的权限管理方案。读完本文你将获得:

  • 动态权限申请的全流程自动化实现
  • 特殊权限(如悬浮窗、系统设置)的处理技巧
  • Kotlin/Java双语言集成方案
  • 常见权限问题的解决方案

权限管理的前世今生

Android 6.0(API 23)引入动态权限机制后,开发者面临着新的挑战:需要在运行时向用户请求危险权限。传统手动实现方式存在代码冗余、状态管理复杂等问题。PermissionsDispatcher作为一款专注于权限管理的开源库,通过注解处理器自动生成权限处理代码,解决了这些痛点。

项目核心模块结构:

快速集成: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

权限请求流程图

mermaid

常见问题解决方案

权限冲突处理

当多个功能需要同一权限时,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权限管理流程,主要优势包括:

  1. 代码自动生成,减少手动编写重复代码
  2. 支持Kotlin/Java双语言
  3. 完整覆盖普通权限和特殊权限
  4. 提供权限 rationale 说明机制
  5. 处理权限被拒和"不再询问"场景

项目持续维护中,最新特性和版本更新请关注:CHANGELOG.md

掌握PermissionsDispatcher,让你的应用权限管理既规范又高效,为用户提供更流畅的体验。现在就集成到你的项目中,体验自动化权限管理的便利吧!

本文示例代码基于PermissionsDispatcher最新版本,完整示例可参考:sample/ktx-sample/

【免费下载链接】PermissionsDispatcher 【免费下载链接】PermissionsDispatcher 项目地址: https://gitcode.com/gh_mirrors/pe/PermissionsDispatcher

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值