android許可權管理,PermissionsDispatcher使用詳解
阿新 • • 發佈:2021-01-09
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 |
✓ | 註冊Activity 或Fragment 處理許可權 |
@NeedsPermission |
✓ | 註釋執行需要一個或多個許可權的操作的方法 |
@OnShowRationale |
註釋一種解釋為什麼需要許可權的方法。它傳入一個PermissionRequest 物件,process${NeedsPermissionMethodName}ProcessRequest 和cancel${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倉庫依賴引入的支援。