Android (Java)一行注解申請權(quán)限AOP方式最佳實現(xiàn)

一扫腺、背景

AOP (面向切面編程),Aspect Oriented Programming的縮寫,意為:面向切面編程句柠,通過預編譯方式和運行期間動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)咸包。AOP是OOP的延續(xù)桃序,是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容烂瘫,是函數(shù)式編程的一種衍生范型媒熊。利用AOP可以對業(yè)務(wù)邏輯的各個部分進行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低坟比,提高程序的可重用性芦鳍,同時提高了開發(fā)的效率。(百度百科)

Android權(quán)限葛账,做Android開發(fā)的都知道柠衅,申請權(quán)限雖然簡單,但是每次使用都寫一次繁瑣的申請流程籍琳。當然茄茁,github上面也有很多比較優(yōu)秀的開源權(quán)限申請框架。

所謂“不想當將軍的士兵不是好士兵”巩割,“不想‘偷懶’的程序員不是好程序員”裙顽。因此,我本著偷懶偷到極致的想法宣谈,利用aspectjrt aop編程方式開發(fā)一個權(quán)限申請工具愈犹,做到在實際使用當中一行代碼完成申請權(quán)限。(牛吹得有點過了)

項目github地址:https://github.com/wushaohongly/AopPermission

運行效果:


申請權(quán)限
權(quán)限拒絕后
二、依賴配置

項目 build.gradle

dependencies {
        ...
        classpath 'org.aspectj:aspectjtools:1.9.5'
    }
allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

app build.gradle

dependencies {
    ...
    implementation 'org.aspectj:aspectjrt:1.9.5'
    implementation 'com.github.wushaohongly:AopPermission:1.0.0'
}

// 最后增加
/**
 * aspectjrt 編譯相關(guān)
 */
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

final def log = project.logger
final def variants = project.android.applicationVariants

// 在構(gòu)建工程時漩怎,執(zhí)行編輯
variants.all { variant ->

//    if (!variant.buildType.isDebuggable()) {
//        log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
//        return;
//    }

    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.8",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
        log.debug "ajc args: " + Arrays.toString(args)

        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler);
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break;
                case IMessage.WARNING:
                    log.warn message.message, message.thrown
                    break;
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break;
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break;
            }
        }
    }
}
三勋颖、使用

以申請撥打電話與讀外置存儲權(quán)限為例,click是一個需要擁有權(quán)限才能執(zhí)行的方法勋锤,在click方法加入@PermissionsCheck(權(quán)限名稱字符串數(shù)組)注解饭玲,執(zhí)行click方法前就會申請注解生命的權(quán)限。

如果申請成功叁执,則會執(zhí)行click方法體茄厘,否則將不執(zhí)行click方法體。

    @PermissionsCheck({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
    public void click(View view) {
        Toast.makeText(this, "權(quán)限申請成功", Toast.LENGTH_LONG).show();
    }
四谈宛、支持配置拒絕權(quán)限彈框

在三次哈,當用戶拒絕權(quán)限后,因為不執(zhí)行click方法體吆录,沒有其他友好性提示窑滞,顯然是不合理的。為了增加擴展性恢筝,類庫支持拒絕權(quán)限后彈出自定義Dialog哀卫。
自定義的Dialog須繼承與類庫的PermissionRefuseDialog。

public class MyRefuseDialog extends PermissionRefuseDialog {

    ...

    public MyRefuseDialog(@NonNull Context context) {
        super(context);
        setContentView(R.layout.布局);
    }

    @Override
    public void setPermissions(String[] permissions) {
        // 父類賦值 permissions
        super.setPermissions(permissions);

        // 這里拿到拒絕的權(quán)限數(shù)組
    }
}

在BaseActivity / BaseFragment當中設(shè)置撬槽,此處為什么呢聊训?因為Dialog是需要依賴Window,所以需要在具體的某個Activity / Fragment當中創(chuàng)建恢氯。(或者還有更好的方式實現(xiàn))

        // 將自定義的Dialog,設(shè)置到 library中
        AopPermissionsConfig.setRefuseDialog(new MyRefuseDialog(this));
五鼓寺、混淆配置
-keep class com.wushaohong.library.permissions.**{*;}
六勋拟、結(jié)語

1、實測是運行在Android10系統(tǒng)妈候,編譯環(huán)境jdk1.8敢靡,據(jù)了解,aspectjrt1.9.5最低支持Android7.0
2苦银、不支持Kotlin語言(kotlin版已實現(xiàn)啸胧,有時間再整理上傳)
3、如有不合理之處幔虏,歡迎各位指點纺念,本人感激不盡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末想括,一起剝皮案震驚了整個濱河市陷谱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖烟逊,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渣窜,死亡現(xiàn)場離奇詭異,居然都是意外死亡宪躯,警方通過查閱死者的電腦和手機乔宿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來访雪,“玉大人详瑞,你說我怎么就攤上這事《簦” “怎么了蛤虐?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肝陪。 經(jīng)常有香客問我驳庭,道長,這世上最難降的妖魔是什么氯窍? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任饲常,我火速辦了婚禮,結(jié)果婚禮上狼讨,老公的妹妹穿的比我還像新娘贝淤。我一直安慰自己,他們只是感情好政供,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布播聪。 她就那樣靜靜地躺著,像睡著了一般布隔。 火紅的嫁衣襯著肌膚如雪离陶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天衅檀,我揣著相機與錄音招刨,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的双肤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼谎倔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猿推?” 一聲冷哼從身側(cè)響起传藏,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毯侦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哭靖,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年侈离,在試婚紗的時候發(fā)現(xiàn)自己被綠了试幽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卦碾,死狀恐怖铺坞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洲胖,我是刑警寧澤济榨,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站绿映,受9級特大地震影響擒滑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叉弦,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一丐一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淹冰,春花似錦库车、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晶乔,卻和暖如春珍坊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瘪弓。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禽最,地道東北人腺怯。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像川无,于是被迫代替她去往敵國和親呛占。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349