目錄
一、 前言
二、支援的場景
三、如何接入
四、簡單使用
五、無上下文的類中如何使用
六、高階使用
一、前言
安卓6.0之後,一些敏感許可權需要進行動態請求,雖說編寫請求授權程式碼並不難,但是每次一需要許可權就需要在檢視中新增一段程式碼,嚴重影響程式碼美觀,同時也增加了一點點工作量。
於是,小盆友閒暇之餘基於AOP封裝了一個基於註解的許可權請求框架。如果有幸加入您的專案,使用過程中有問題或是有哪些不便,請留言區或github上與我交流,共同進步。如果喜歡這個框架請給個star和❤️。
github地址:github.com/zincPower/J…
二、支援的場景
- activity
- fragment
- service
- 自定義view
- 無上下文的類中(需要通過 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中均可使用
如果需要更多的交流與探討,可以通過以下微信二維碼加小盆友好友。