基於註解的6.0許可權動態請求框架——JPermission

猛猛的小盆友發表於2019-03-01

目錄
一、 前言
二、支援的場景
三、如何接入
四、簡單使用
五、無上下文的類中如何使用
六、高階使用

一、前言

安卓6.0之後,一些敏感許可權需要進行動態請求,雖說編寫請求授權程式碼並不難,但是每次一需要許可權就需要在檢視中新增一段程式碼,嚴重影響程式碼美觀,同時也增加了一點點工作量。
於是,小盆友閒暇之餘基於AOP封裝了一個基於註解的許可權請求框架。如果有幸加入您的專案,使用過程中有問題或是有哪些不便,請留言區或github上與我交流,共同進步。如果喜歡這個框架請給個star和❤️。

github地址:github.com/zincPower/J…

示例圖

二、支援的場景

  1. activity
  2. fragment
  3. service
  4. 自定義view
  5. 無上下文的類中(需要通過 JPermissionHelper 注入context)

三、如何接入

1、在專案的gradle中新增如下程式碼

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath `com.android.tools.build:gradle:3.0.0`
        classpath `com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.1.0` //新增這一行
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url `https://jitpack.io` }		//新增這一行
    }
}
複製程式碼

值得一提:如果你的工程裡gradle版本是3.0.0以上,請使用aspectjx:1.1.0以上版本,否則會報Required: PROJECT, SUB_PROJECTS, EXTERNAL_LIBRARIES. Found: EXTERNAL_LIBRARIES, PROJECT, PROJECT_LOCAL_DEPS, SUB_PROJECTS, SUB_PROJECTS_LOCAL_DEPS

aspectjx歷史版本檢視地址:github.com/HujiangTech…

2、在app的module中增加如下
程式碼

apply plugin: `com.android.application`
apply plugin: `android-aspectjx` //新增這一行
複製程式碼

在依賴中增加:

compile `com.github.zincPower:JPermission:0.5`
複製程式碼

四、簡單使用

1、在需要請求許可權的方法加上註解 @Permission,請求許可權可以多個,如下

//requestCode可設可不設,框架自帶預設值。在取消和拒絕回撥中,會將這個值返回,用於各自請求邏輯處理
@Permission({Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode = 100)
private void requestOnePermission() {
    //do something
}
複製程式碼

2、編寫取消和拒絕(即點選了“不再提示”)回撥,如下:

//只需加上註解 @PermissionCanceled 和 引數型別為 CancelInfo 的一個引數即可
@PermissionCanceled()
private void cancel(CancelInfo cancelInfo) {
   //do something when the permission was canceled.
}
//只需加上註解 @PermissionDenied 和 引數型別為 DenyInfo 的一個引數即可
@PermissionDenied()
private void deny(DenyInfo denyInfo) {
   //do something when the permission was denied.
}
複製程式碼

值得一提:如果被拒絕,可以彈一個對話方塊,詢問是否要前往系統許可權頁面讓使用者自己手動開啟。如果需要的話,可以通過以下程式碼前往(對話方塊自行解決,本框架不包含):

//前往開啟許可權的介面
JPermissionUtil.goToMenu(context);
複製程式碼

五、無上下文的類中如何使用

1、需要通過 JPermissionHelper 提供一個context,當然不注入也能正常使用,但只能在有上下文的類中使用,注入程式碼如下

JPermissionHelper.injectContext(this);
複製程式碼

溫馨提示:為了避免記憶體洩漏,請於Application中注入

2、無上下文的類中如下編寫(用法與“簡單使用”一樣),只需要在需要的地方呼叫對應的方法。例如呼叫此處的requestInNormalClass方法即可

public class NoneContext {

    private final String TAG = NoneContext.class.getSimpleName();

    @Permission(value = {Manifest.permission.ACCESS_FINE_LOCATION}, requestCode = 200)
    public void requestInNormalClass() {
        Log.i(TAG, "請求定位許可權成功,200");
    }

    @PermissionCanceled()
    private void cancel(CancelInfo cancelInfo) {
        Log.i(TAG, "cancel:" + cancelInfo.getRequestCode());
    }

    @PermissionDenied()
    private void deny(DenyInfo denyInfo) {
        Log.i(TAG, "deny [code:" + denyInfo.getRequestInfo() + " ; deny:" + denyInfo.getDeniedPermissions() + "]");
    }

}
複製程式碼

六、高階使用

1、請求manifest中的所有許可權(主要用於app開啟時,進行一次許可權請求)

//不需要回撥監聽
JPermissionUtil.requestAllPermission(this);

//需要回撥監聽
JPermissionUtil.requestAllPermission(this, new IPermission() {
            @Override
            public void ganted() {
                Log.i(JPermissionHelper.TAG, "ganted====》申請manifest的全部");
            }

            @Override
            public void denied(int requestCode, List<String> denyList) {
                Log.i(JPermissionHelper.TAG, "denied====》申請manifest的全部{code=" + requestCode + ";denyList=" + denyList + "}");
            }

            @Override
            public void canceled(int requestCode) {
                Log.i(JPermissionHelper.TAG, "canceled===》申請manifest的全部{code= " + requestCode + "}");
            }
        });
複製程式碼

某些特殊情況,初始請求中比較敏感(例如:讀取手機簡訊 或 定位許可權 等),可以使用以下程式碼進行剔除初始請求中所包含的許可權

List<String> excluePermission = new ArrayList<>();
excluePermission.add(Manifest.permission.CAMERA);
excluePermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
//不需要回撥
JPermissionUtil.requestAllPermission(this, excluePermission);

//需要回撥
JPermissionUtil.requestAllPermission(this, excluePermission, new IPermission() {
    @Override
    public void ganted() {
        
    }

    @Override
    public void denied(int requestCode, List<String> denyList) {

    }

    @Override
    public void canceled(int requestCode) {

    }
});

複製程式碼

2、配置前往的系統許可權頁,框架自帶了預設的系統許可權頁,但如需根據不同品牌進行個性化設定,可在程式碼增加如下程式碼

//第一個引數為品牌,框架會根據Build.MANUFACTURER進行匹配(大小寫均可)
//第二個引數為需要處理的類class檔案,需要實現IMenu介面
JPermissionUtil.setManuFacturer("genymotion", MyTestGenymotionMenu.class);
複製程式碼

3、設定有回撥值的取消和拒絕回撥。如果請求許可權時,填了requestCode=200,則取消或拒絕時會呼叫requestCode相同(此處即為200)的方法。

@PermissionCanceled(requestCode = 200)
private void cancelCode200(CancelInfo cancelInfo){
    Toast.makeText(this, "cancel__200", Toast.LENGTH_SHORT).show();
}

@PermissionDenied(requestCode = 200)
private void denyCode200(DenyInfo denyInfo){
    Toast.makeText(this, "deny__200", Toast.LENGTH_SHORT).show();
}
複製程式碼

值得一提:呼叫了requestCode相同的方法,同時也會呼叫不設定requestCode的方法。

4、service和fragment中均可使用

如果需要更多的交流與探討,可以通過以下微信二維碼加小盆友好友。

基於註解的6.0許可權動態請求框架——JPermission

相關文章