android权限管理,PermissionsDispatcher使用详解

0.前言

PermissionsDispatcher提供了一个简单的基于注释的API来处理运行时权限。该库减轻了编写一堆检查语句(无论是否已授予您权限)带来的负担,以保持您的代码干净安全。

地址:https://github.com/permissions-dispatcher/PermissionsDispatcher

1.安装

首先在项目工程下的build.gradle文件中加入对maven仓库依赖引入的支持。

 

allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}

 

将PermissionsDispatcher添加到您的项目,请在您的应用程序模块 build.gradle文件中包括以下内容

 

dependencies {
  implementation "org.permissionsdispatcher:permissionsdispatcher:${latest.version}"
  annotationProcessor "org.permissionsdispatcher:permissionsdispatcher-processor:${latest.version}"
}

 

 

2.用法

0.准备AndroidManifest

将需要用到的权限添加到AndroidManifest.xml

如相机权限

<uses-permission android:name="android.permission.CAMERA" />

1.附加注释

PermissionsDispatcher仅引入一些注释,以保持其常规API的简洁:

注意:带注释的方法不能为private

注解需要描述
@RuntimePermissions 注册ActivityFragment处理权限
@NeedsPermission 注释执行需要一个或多个权限的操作的方法
@OnShowRationale   注释一种解释为什么需要权限的方法。它传入一个PermissionRequest对象,对象可用于在用户输入时继续或中止当前的权限请求。如果不为该方法指定任何参数,则编译器将生成process${NeedsPermissionMethodName}ProcessRequestcancel${NeedsPermissionMethodName}ProcessRequest您可以使用这些方法代替PermissionRequest(例如:with DialogFragment
@OnPermissionDenied   注释如果用户未授予权限则调用的方法
@OnNeverAskAgain   注释一个方法,如果用户选择让设备“不再询问”权限,则调用该方法

 

例:(如下代码自动弹出授权框)

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.RuntimePermissions;

import android.Manifest;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Toast;

import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;

@RuntimePermissions
public class MainActivity extends AppCompatActivity {

    SubsamplingScaleImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MainActivityPermissionsDispatcher.method_xWithPermissionCheck(this);
        imageView = (SubsamplingScaleImageView)findViewById(R.id.imageView);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                choosePhoto();
            }
        });
    }

    public static final int RC_CHOOSE_PHOTO = 2;

    private void choosePhoto() {
        //调用相册选取图像
        Intent intentToPickPic = new Intent(Intent.ACTION_PICK, null);
        intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intentToPickPic, RC_CHOOSE_PHOTO);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        //回调选取结果
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case RC_CHOOSE_PHOTO:
                try{
                    Uri uri = data.getData();
                    imageView.setImage(ImageSource.uri(uri));
                }catch (Exception E){
                    Toast.makeText(this, "出错", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        //生成辅助类_动态注册权限
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // NOTE: delegate the permission handling to generated method
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

    @NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE})
     void method_x() {
        //使用权限
        Toast.makeText(this, "已有权限", Toast.LENGTH_SHORT).show();
    }
}

 

 

 

 

 

 

 


1、添加依赖

首先在项目工程下的build.gradle文件中加入对maven仓库依赖引入的支持。

posted @ 2021-01-09 11:16  sunny开始学坏  阅读(3199)  评论(0编辑  收藏  举报