目錄
1、 前言
2、支持的場景
3、如何接入
4、簡單使用
5、無上下文的類中如何使用
6、高級使用
java
安卓6.0以後,一些敏感權限須要進行動態請求,雖然說編寫請求受權代碼並不難,可是每次一須要權限就須要在視圖中添加一段代碼,嚴重影響代碼美觀,同時也增長了一點點工做量。 因而,小盆友閒暇之餘基於AOP封裝了一個基於註解的權限請求框架。若是有幸加入您的項目,使用過程當中有問題或是有哪些不便,請留言區或github上與我交流,共同進步。若是喜歡這個框架請給個star和❤️。android
github地址:github.com/zincPower/J…git
一、在項目的gradle中添加以下代碼github
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…app
二、在app的module中增長以下 代碼框架
apply plugin: 'com.android.application'
apply plugin: 'android-aspectjx' //添加這一行
複製代碼
在依賴中增長:maven
compile 'com.github.zincPower:JPermission:0.5'
複製代碼
一、在須要請求權限的方法加上註解 @Permission,請求權限能夠多個,以下ide
//requestCode可設可不設,框架自帶默認值。在取消和拒絕回調中,會將這個值返回,用於各自請求邏輯處理
@Permission({Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode = 100)
private void requestOnePermission() {
//do something
}
複製代碼
二、編寫取消和拒絕(即點擊了「再也不提示」)回調,以下:gradle
//只需加上註解 @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);
複製代碼
一、須要經過 JPermissionHelper 提供一個context,固然不注入也能正常使用,但只能在有上下文的類中使用,注入代碼以下
JPermissionHelper.injectContext(this);
複製代碼
舒適提示:爲了不內存泄漏,請於Application中注入
二、無上下文的類中以下編寫(用法與「簡單使用」同樣),只須要在須要的地方調用對應的方法。例如調用此處的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() + "]");
}
}
複製代碼
一、請求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) {
}
});
複製代碼
二、配置前往的系統權限頁,框架自帶了默認的系統權限頁,但如需根據不一樣品牌進行個性化設置,可在代碼增長以下代碼
//第一個參數爲品牌,框架會根據Build.MANUFACTURER進行匹配(大小寫都可)
//第二個參數爲須要處理的類class文件,須要實現IMenu接口
JPermissionUtil.setManuFacturer("genymotion", MyTestGenymotionMenu.class);
複製代碼
三、設置有回調值的取消和拒絕回調。若是請求權限時,填了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的方法。
四、service和fragment中都可使用
若是須要更多的交流與探討,能夠經過如下微信二維碼加小盆友好友。