Android基于注解的6.0權(quán)限動態(tài)請求框架詳解
前言
安卓6.0之后,一些敏感權(quán)限需要進(jìn)行動態(tài)請求,雖說編寫請求授權(quán)代碼并不難,但是每次一需要權(quán)限就需要在視圖中添加一段代碼,嚴(yán)重影響代碼美觀,同時也增加了一點(diǎn)點(diǎn)工作量。
于是,小盆友閑暇之余基于AOP封裝了一個基于注解的權(quán)限請求框架。如果有幸加入您的項(xiàng)目,使用過程中有問題或是有哪些不便,請留言區(qū)或github上與我交流,共同進(jìn)步。如果喜歡這個框架請給個star和❤️。
github地址:https://github.com/zincPower/JPermission
先上圖,看看效果。。。第一次錄制,效果比較差,請將就下??上螺d源碼進(jìn)行親自操作。
示例圖
如何接入
1、在項(xiàng)目的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以上版本,否則會報(bào)Required: PROJECT, SUB_PROJECTS, EXTERNAL_LIBRARIES. Found: EXTERNAL_LIBRARIES, PROJECT, PROJECT_LOCAL_DEPS, SUB_PROJECTS, SUB_PROJECTS_LOCAL_DEPS
aspectjx歷史版本查看地址:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx/blob/master/CHANGELOG.md
2、在app的module中增加如下
代碼
apply plugin: 'com.android.application' apply plugin: 'android-aspectjx' //添加這一行
在依賴中增加:
compile 'com.github.zincPower:JPermission:0.1'
簡單使用
1、在需要請求權(quán)限的方法加上注解 @Permission,請求權(quán)限可以多個,如下
//requestCode可設(shè)可不設(shè),框架自帶默認(rèn)值。在取消和拒絕回調(diào)中,會將這個值返回,用于各自請求邏輯處理 @Permission({Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode = 100) private void requestOnePermission() { //do something }
2、編寫取消和拒絕(即點(diǎn)擊了“不再提示”)回調(diào),如下:
@PermissionCanceled() private void cancel(CancelInfo cancelInfo) { //do something when the permission was canceled. } @PermissionDenied() private void deny(DenyInfo denyInfo) { //do something when the permission was denied. }
值得一提:如果被拒絕,可以彈一個對話框,詢問是否要前往系統(tǒng)權(quán)限頁面讓用戶自己手動開啟。如果需要的話,可以通過以下代碼前往(對話框自行解決,本框架不包含):
//前往開啟權(quán)限的界面 JPermissionUtil.goToMenu(context);
高級使用
1、請求manifest中的所有權(quán)限(主要用于app開啟時,進(jìn)行一次權(quán)限請求)
//不需要回調(diào)監(jiān)聽 JPermissionUtil.requestAllPermission(this); //需要回調(diào)監(jiān)聽 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 + "}"); } });
某些特殊情況,初始請求中比較敏感(例如:讀取手機(jī)短信 或 定位權(quán)限 等),可以使用以下代碼進(jìn)行剔除初始請求中所包含的權(quán)限
List<String> excluePermission = new ArrayList<>(); excluePermission.add(Manifest.permission.CAMERA); excluePermission.add(Manifest.permission.ACCESS_FINE_LOCATION); //不需要回調(diào) JPermissionUtil.requestAllPermission(this, excluePermission); //需要回調(diào) 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、配置前往的系統(tǒng)權(quán)限頁,框架自帶了默認(rèn)的系統(tǒng)權(quán)限頁,但如需根據(jù)不同品牌進(jìn)行個性化設(shè)置,可在代碼增加如下代碼
//第一個參數(shù)為品牌,框架會根據(jù)Build.MANUFACTURER進(jìn)行匹配(大小寫均可) //第二個參數(shù)為需要處理的類class文件,需要實(shí)現(xiàn)IMenu接口 JPermissionUtil.setManuFacturer("genymotion", MyTestGenymotionMenu.class);
3、設(shè)置有回調(diào)值的取消和拒絕回調(diào)。如果請求權(quán)限時,填了requestCode=200,則取消或拒絕時會調(diào)用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(); }
值得一提:調(diào)用了requestCode相同的方法,同時也會調(diào)用不設(shè)置requestCode的方法。
4、service和fragment中均可使用
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android視頻懸浮窗口實(shí)現(xiàn)的示例代碼
這篇文章主要介紹了Android視頻懸浮窗口實(shí)現(xiàn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04kotlin 注解 @Parcelize 使用示例和步驟詳解
Parcelable 接口是 Android 中用于在組件之間傳遞對象的一種方式,在 Kotlin 中,@Parcelize 注解用于簡化實(shí)現(xiàn) Android Parcelable 接口的過程,本文給大家分享kotlin 注解 @Parcelize 使用示例,感興趣的朋友一起看看吧2024-06-06android中RecyclerView自定義分割線實(shí)現(xiàn)
本篇文章主要介紹了android中RecyclerView自定義分割線實(shí)現(xiàn),由于RecyclerView的布局方式多種多樣,所以它的分割線也根據(jù)布局的不同有所差異,本文只針對LinearLayoutManager線性布局。2017-03-03Ubuntu中為Android系統(tǒng)上實(shí)現(xiàn)內(nèi)置C可執(zhí)行程序測試Linux內(nèi)核驅(qū)動程序
本文主要介紹在Ubuntu上為Android系統(tǒng)內(nèi)置C可執(zhí)行程序測試Linux內(nèi)核驅(qū)動程序,這里對測試Linux 內(nèi)核驅(qū)動程序做了詳細(xì)介紹,并附有代碼示例,有興趣的小伙伴可以參考下2016-08-08實(shí)例詳解Android文件存儲數(shù)據(jù)方式
總體的來講,數(shù)據(jù)存儲方式有三種:一個是文件,一個是數(shù)據(jù)庫,另一個則是網(wǎng)絡(luò)。下面通過本文給大家介紹Android文件存儲數(shù)據(jù)方式,對android文件存儲數(shù)據(jù)相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-01-01Android?實(shí)現(xiàn)卡片堆疊錢包管理動畫效果
這篇文章主要介紹了Android?實(shí)現(xiàn)卡片堆疊錢包管理動畫效果,實(shí)現(xiàn)思路是在動畫回調(diào)中requestLayout?實(shí)現(xiàn)動畫效果,用Bounds?對象記錄每一個CardView?對象的初始位置,當(dāng)前位置,運(yùn)動目標(biāo)位置,需要的朋友可以參考下2022-07-07Android編程使用ListView實(shí)現(xiàn)數(shù)據(jù)列表顯示的方法
這篇文章主要介紹了Android編程使用ListView實(shí)現(xiàn)數(shù)據(jù)列表顯示的方法,實(shí)例分析了Android中ListView控件的使用技巧,需要的朋友可以參考下2016-01-01