告别权限申请模板代码:Android Studio中PermissionsDispatcher的5分钟上手指南

告别权限申请模板代码:Android Studio中PermissionsDispatcher的5分钟上手指南

【免费下载链接】PermissionsDispatcher 【免费下载链接】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_WINDOWWRITE_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:

  1. 打开File > Settings > Editor > Live Templates
  2. 新建模板组(如PermissionsDispatcher
  3. 添加模板代码:
@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 【免费下载链接】PermissionsDispatcher 项目地址: https://gitcode.com/gh_mirrors/pe/PermissionsDispatcher

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

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

抵扣说明:

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

余额充值