1. 程式人生 > >6.0以上手機執行時許可權第三方PermissionsDispatcher的使用

6.0以上手機執行時許可權第三方PermissionsDispatcher的使用

PermissionsDispatcher通過註解的方式,動態生成類處理執行時許可權。配合外掛使用,可自動生成程式碼。

使用方法如下:

1>將下面這段程式碼新增到project的build.gradle檔案中。

buildscript {
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

2>將下面的程式碼新增到app module的build.gradle檔案中,${latest.version}填寫最新的版本號,目前為2.1.3。

apply plugin: 'android-apt'

dependencies {
  compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
  apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3>在Android Studio中選擇File——Setting——Plugins,搜尋PermissionsDispatcher,點選install安裝,如下圖所示:

安裝外掛

4>準備工作已經完成了,下面來進行程式碼的生成,在Android Studio中選擇Code——Generate——Generate Runtime Permissions,如下圖所示:

生成程式碼

@NeedsPermission 
當申請的許可權被使用者允許後,呼叫此方法。

@OnShowRationale 
當第一次申請許可權時,使用者選擇拒絕,再次申請時呼叫此方法,在此方法中提示使用者為什麼需要這個許可權。

@OnPermissionDenied 
當申請的許可權被使用者拒絕後,呼叫此方法

@OnNeverAskAgain 
當用戶點選不再詢問後,呼叫此方法。

程式碼處理如下:

package com.yang.permissiondemo;

import android.Manifest;
import android.annotation.TargetApi;
import
android.content.DialogInterface; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import android.widget.Toast; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import permissions.dispatcher.NeedsPermission; import permissions.dispatcher.OnNeverAskAgain; import permissions.dispatcher.OnPermissionDenied; import permissions.dispatcher.OnShowRationale; import permissions.dispatcher.PermissionRequest; import permissions.dispatcher.RuntimePermissions; @RuntimePermissions public class PermissionsDispatcherActivity extends AppCompatActivity { @Bind(R.id.tv_permission_status) TextView tvPermissionStatus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_permission); ButterKnife.bind(this); } @OnClick(R.id.btn_request_permission) public void onClick() { requestPermission(); } @TargetApi(Build.VERSION_CODES.M) private void requestPermission() { //申請許可權 PermissionsDispatcherActivityPermissionsDispatcher.openCameraWithCheck(this); } @NeedsPermission(Manifest.permission.CAMERA) void openCamera() { tvPermissionStatus.setTextColor(Color.GREEN); tvPermissionStatus.setText("相機許可權已申請"); } @OnShowRationale(Manifest.permission.CAMERA) void showRationale(final PermissionRequest request) { new AlertDialog.Builder(this) .setMessage("申請相機許可權") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //再次執行請求 request.proceed(); } }) .show(); } @OnPermissionDenied(Manifest.permission.CAMERA) void permissionDenied() { Toast.makeText(this, "許可權被拒絕", Toast.LENGTH_SHORT).show(); } @OnNeverAskAgain(Manifest.permission.CAMERA) void neverAskAgain() { Toast.makeText(this, "不再詢問", Toast.LENGTH_SHORT).show(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionsDispatcherActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

4.相容性

為了保持相容性建議使用v4包的相容方法:

ContextCompat.checkSelfPermission() 
ActivityCompat.requestPermissions() 
ActivityCompat.OnRequestPermissionsResultCallback 
ActivityCompat.shouldShowRequestPermissionRationale()

當targetSdkVersion小於23,但是裝置是6.0系統時:

  • 裝置許可權模型使用老的版本
  • 清單檔案中列出的許可權只會在安裝時詢問
  • 使用者可以在設定列表中編輯相關許可權,這對應用能否正常執行有很大影響

當targetSdkVersion大於等於23,但是裝置系統小於6.0時:

  • 裝置許可權模型使用老的版本
  • 清單檔案中列出的許可權只會在安裝時詢問

5.寫在最後

原始碼已託管到GitHub上,歡迎Fork,覺得還不錯就Start一下吧!