1. 程式人生 > 實用技巧 >android許可權管理,PermissionsDispatcher使用詳解

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(例如:withDialogFragment
@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倉庫依賴引入的支援。