1. 程式人生 > >AndPermission是一個執行許可權管理庫,相容Android O,同時最大程度上相容了國產機

AndPermission是一個執行許可權管理庫,相容Android O,同時最大程度上相容了國產機

特性

支援申請許可權組,相容Android8.0,最大程度上相容國產機。
鏈式呼叫,一句話申請許可權,不需要判斷版本和是否擁有某許可權。
支援註解回撥結果、支援Listener回撥結果。
對於某個許可權拒絕過一次後,下次申請可以使用RationaleDailog提示使用者許可權的重要性,面得被使用者勾選不再提示從而再也申請不了許可權(只能在系統Setting中授權)。
就算使用者拒絕許可權並勾選不再提示,可使用SettingDialog提示使用者去設定中授權。
RationaleDialog和SettingDialog允許開發者自定義。
AndPermission自帶預設對話方塊除可自定義外,也支援國際化。
支援在任何地方申請許可權,不僅限於Activity和Fragment等。

引用方法

Gradle

compile ‘com.yanzhenjie:permission:1.1.0’

Maven


com.yanzhenjie
permission
1.1.0
pom

使用介紹

我建議下載Demo並閱讀README會幫助你理解。
申請許可權

特別注意:你在申請許可權之前不需要判斷版本和是否擁有某許可權。

// 在Activity:
AndPermission.with(activity)
.requestCode(100)
.permission(Permission.SMS)
.rationale(…)
.callback(…)
.start();

// 在Fragment:
AndPermission.with(fragment)
.requestCode(101)
.permission(
// 申請多個許可權組方式:
Permission.LOCATION,
Permissioin.STORAGE
)
.rationale(…)
.callback(…)
.start();

// 在其它任何地方:
AndPermission.with(context)
.requestCode(102)
.permission(Permission.LOCATION)
.rationale(…)
.callback(…)
.start();

// 如果你不想申請許可權組,僅僅想申請某一個許可權:
AndPermission.with(this)
.requestCode(300)
.permission(Manifest.permission.WRITE_CONTACTS)
.rationale(…)
.callback(…)
.start();

// 如果你不想申請許可權組,僅僅想申請某幾個許可權:
AndPermission.with(this)
.requestCode(300)
.permission(
Manifest.permission.WRITE_CONTACTS,
Manifest.permission.READ_SMS
)
.rationale(…)
.callback(…)
.start();

接受回撥結果

接受回撥結果目前有兩種方式:一、Listener方式,二、註解方式。
方式一:Listener方式回撥

在callback()方法傳入PermissionListener即可,授權成功或者失敗至少會回撥其中一個方法。

AndPermission.with(context)

.requestCode(200)
.callback(listener)
.start();

private PermissionListener listener = new PermissionListener() {
@Override
public void onSucceed(int requestCode, List grantedPermissions) {
// 許可權申請成功回撥。

    // 這裡的requestCode就是申請時設定的requestCode。
    // 和onActivityResult()的requestCode一樣,用來區分多個不同的請求。
    if(requestCode == 200) {
        // TODO ...
    }
}

@Override
public void onFailed(int requestCode, List<String> deniedPermissions) {
    // 許可權申請失敗回撥。
    if(requestCode == 200) {
        // TODO ...
    }
}

};

方式二:註解方式回撥

在callback()方法傳入你的回撥方法所在例項的物件即可。

AndPermission.with(context)

.requestCode(300)
.callback(this)
.start();

// 成功回撥的方法,用註解即可,這裡的300就是請求時的requestCode。
@PermissionYes(300)
private void getPermissionYes(List grantedPermissions) {
// TODO 申請許可權成功。
}

@PermissionNo(300)
private void getPermissionNo(List deniedPermissions) {
// TODO 申請許可權失敗。
}

如果你會用了,你就可以大刀闊斧的幹了,其它複雜的判斷邏輯,AndPermission自動完成。
Rationale能力

Android執行時許可權有一個特點,在拒絕過一次許可權後,再此申請該許可權,在申請框會多一個[不再提示]的複選框,當用戶勾選了[不再提示]並拒絕了許可權後,下次再申請該許可權將直接回調申請失敗。
因此Rationale功能是在使用者拒絕一次許可權後,再次申請時檢測到已經申請過一次該許可權了,允許開發者彈窗說明申請許可權的目的,獲取使用者的同意後再申請許可權,避免使用者勾選不再提示,導致不能再次申請許可權。
方式一:使用AndPermssion預設MD風格對話方塊

AndPermission.with(this)

.requestCode(…)
.rationale((requestCode, rationale) ->
// 此對話方塊可以自定義,呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(context, rationale).show()
)
.start()

方式二:自定義對話方塊

AndPermission.with(this)

.requestCode(…)
.rationale(rationaleListener)
.start()

/**
* Rationale支援,這裡自定義對話方塊。
*/
private RationaleListener rationaleListener = (requestCode, rationale) -> {
AlertDialog.newBuilder(this)
.setTitle(“友好提醒”)
.setMessage(“你已拒絕過定位許可權,沒有定位定位許可權無法為你推薦附近的妹子,你看著辦!”)
.setPositiveButton(“好,給你”, (dialog, which) -> {
rationale.resume();
})
.setNegativeButton(“我拒絕”, (dialog, which) -> {
rationale.cancel();
}).show();
};

提示使用者在系統設定中授權

當用戶拒絕許可權並勾選了不再提示時,此時再次申請許可權時將會直接回調申請失敗,因此AndPermission提供了一個供使用者在系統Setting中給我們授權的能力。

我們在授權失敗的回撥方法中新增如下程式碼,以下三種選擇一種即可:

// 是否有不再提示並拒絕的許可權。
if (AndPermission.hasAlwaysDeniedPermission(activity, deniedPermissions)) {
// 第一種:用AndPermission預設的提示語。
AndPermission.defaultSettingDialog(activity, 400).show();

// 第二種:用自定義的提示語。
AndPermission.defaultSettingDialog(activity, 400)
.setTitle("許可權申請失敗")
.setMessage("您拒絕了我們必要的一些許可權,已經沒法愉快的玩耍了,請在設定中授權!")
.setPositiveButton("好,去設定")
.show();

// 第三種:自定義dialog樣式。
SettingService settingService = AndPermission.defineSettingDialog(activity, 400);
...
// 你的dialog點選了確定呼叫:
settingService.execute();
// 你的dialog點選了取消呼叫:
settingService.cancel();

}

如果你是在Activity/Fragment中呼叫的上述程式碼,那麼當用戶在系統Setting中操作完成後,會回撥Activity/Fragment中的這個方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 400: { // 這個400就是上面defineSettingDialog()的第二個引數。
// 你可以在這裡檢查你需要的許可權是否被允許,並做相應的操作。
break;
}
}
}

混淆

如果使用Listener接受回撥結果,不用任何配置。
使用註解的方式回撥結果,在proguard中新增如下配置:

-keepclassmembers class ** {
@com.yanzhenjie.permission.PermissionYes ;
}
-keepclassmembers class ** {
@com.yanzhenjie.permission.PermissionNo ;
}

國產手機適配方案

AndPermission是嚴格按照Android系統的執行時許可權設計的,並最大限度上相容了國產手機,目前發現的國產手機bug及解決方案:

部分中國廠商生產手機(例如小米某型號)的Rationale功能,在第一次拒絕後,第二次申請時不會返回true,並且會回撥申請失敗,也就是說在第一次決絕後預設勾選了不再提示,所以建議一定使用SettingDialog:提示使用者在系統設定中授權。

部分中國廠商生產手機(例如小米、華為某型號)在申請許可權時,使用者點選確定授權後,還是回撥我們申請失敗,這個時候其實我們是擁有許可權的,建議在失敗的回撥房中呼叫AppOpsManager做許可權判斷: if(AndPermission.hasPermission()) {// 執行操作。}

部分中國廠商生產手機在系統Setting中設定**[禁用/詢問]**某許可權,但是在申請此許可權時卻直接提示有許可權,這可能是廠商故意這樣設計的,當我們真正執行需要這個許可權程式碼的時候系統會自動申請許可權,但是為了相容到其它手機,建議在成功的回撥房中呼叫AppOpsManager做許可權判斷: if(AndPermission.hasPermission()) {// 執行操作。}

部分中國廠商生產手機(例如vivo、pppo某型號)在使用者允許許可權,並且回調了許可權授權成功的方法,但是實際執行程式碼時並沒有這個許可權,建議在成功的回撥房中呼叫AppOpsManager做許可權判斷: if(AndPermission.hasPermission()) {// 有許可權。}

部分開發者反饋,在某些手機的Setting中授權後,檢查時還是沒有許可權,執行響應的程式碼時應用崩潰(錯誤提示是沒有許可權),這種手機真的相容不到了,我也覺得沒必要相容了,建議直接放棄這種平臺。

我在開發中還遇到過一些情況,就不一一列舉了,總結了一下這些情況都是回撥結果和實際情況不符。

建議一:如果你擔心使用標準的許可權策略會使App崩潰,那麼建議在回撥的成功和失敗方法中都加這段程式碼判斷實際許可權:

if(AndPermission.hasPermission()) {
// TODO 執行擁有許可權時的下一步。
} else {
// 使用AndPermission提供的預設設定dialog,使用者點選確定後會開啟App的設定頁面讓使用者授權。
AndPermission.defaultSettingDialog(this, requestCode).show();

// 建議:自定義這個Dialog,提示具體需要開啟什麼許可權,自定義Dialog具體實現上面有示例程式碼。

}

AndPermission.hasPermission()的原理是在Android 6.0以下預設返回true,在6.0以上使用AppOps和checkSelfPermission檢測許可權全部通過則返回true,只有有一個沒通過就返回false。

建議二:在實際開發中,比如小米手機,它有自己的一套許可權管理系統,並不完全遵循系統的執行時許可權策略,這種情況下的解決方案還是遵循建議一,但是不要使用SettingDialog的方式,而是直接提示用去開啟系統Setting自行授權,或者你也可以在使用者點選了確定按鈕後直接開啟系統Setting讓使用者授權。

相關推薦

AndPermission一個執行許可權管理相容Android O同時程度相容國產機

特性 支援申請許可權組,相容Android8.0,最大程度上相容國產機。 鏈式呼叫,一句話申請許可權,不需要判斷版本和是否擁有某許可權。 支援註解回撥結果、支援Listener回撥結果。 對於某個許可權拒絕過一次後,下次申請可以使用RationaleDailo

究極難題 :一個執行10秒以上至無窮的呼叫函式成功後有返回值。在多工執行緒中怎麼實現呼叫不卡住該執行緒?

究極難題 :一個執行10秒以上至無窮的呼叫函式,成功後有返回值。在多工執行緒中怎麼實現呼叫不卡住該執行緒? Note:一旦呼叫函式,中途無法取消。 思路一:讓其執行在獨立執行緒內。加超時時間。 1. 在超時時間內函式有返回值,則函式執行結束。則獨立執行緒結束。 2. 在超時時

使用 SpringBoot + SpringDataJpa 設計一個通用許可權管理系統

一、前言 1、2018.11 月份,筆者參與了 廣東海洋大學課室管理系統 的開發,開發人員由 ITAEM 軟體開發團隊(艾騰團隊)組成。 2、筆者之前參與過 廣東海洋大學學生宿舍管理系統 的開發,這次不打算參與無腦耗時的業務邏輯模組(CRUD),負責許可權管理系統模組。 3、起初打算

android:android6.0執行許可權管理

為了更好的保護了使用者的隱私,在Google釋出的android6.0中推出了新的許可權機制,Google將許可權分為兩類,一類是Normal Permissions,這類許可權一般不涉及使用者隱私,是不需要使用者進行授權的,比如手機震動、訪問網路等;另一類是D

Selector通過一個執行管理多個Channel

Selector是NIO中實現I/O多路複用的關鍵類。Selector實現了通過一個執行緒管理多個Channel,從而管理多個網路連線的目的。 Channel代表這一個網路連線通道,我們可以將Channel註冊到Selector中以實現Selector對其的管理。一個Cha

從鍵盤輸入三個數編寫一個max函式可以輸出三個數中的數字

int max(int a,int b,int c ); int main(int argc, const char * argv[]) {     int a,b,c;     scanf("%d",&a);     scanf("%d",&b);    

拼多多筆試題一:給出一個無序整數陣列求任意三個數的乘積

題目: 給出一個可能包含正數、零、負數的無序整數序列,從該序列中任選三個數計算乘積,求最大的乘積是多少? 要求:演算法的時間複雜度為O(n),空間複雜度為O(1). 輸入: 第一行輸入n表示序列中整數的個數 第二行輸入n個整數 輸出; 最大的乘積 例如: 輸入: 4 1 0

給定一個正整數陣列找所有元素組合起來的值(答案)

class MaxNumber(object): def __init__(self, intlst): self.lst = intlst self.ilen = len(self.lst) self.result

spring 多資料來源手動管理事務程度保障資料一致性

模板程式碼如下: @Autowired private DataSourceTransactionManager transactionManager; public void

一個整數拆分為幾個數的和求這幾個數的

#coding=utf-8 import pdb def split_int( num ):     #pdb.set_trace()     if num < 2:         result = 0     elif num == 2:         resul

英特爾發布至強可擴展處理器業界十年來技術進步(核心思想:數據洪流出現)

strong 中心 結合 的人 目的 表示 png 高度 最終 集微網 7月12日報道今天,英特爾公司在北京正式發布了至強可擴展處理器。該處理器可為計算、網絡和存儲帶來針對工作負載優化的性能,向下一代雲基礎設施提供堅實基礎,並賦能數據分析、人工智能、高性能計算、網絡轉型等各

如何設置IIS程序池的回收時間才能程度的減少對用戶的影響?

上班 sts 工具 reat 實現 時間段 設定 避免 安裝 作為.Net開發人員,其實對IIS的應用程序池知之甚少,在工作中我也有幾次遇到過網站無故打不開的情況,找了半天原因也找不到是怎麽造成的,有一次我給網站找了一個程序程序池後發現就能正常訪問了,這也讓我對辨別是問題產

區塊鏈技術很程度會影響數字貨幣的發展

區塊鏈技術隨著區塊鏈技術的影響力逐漸的擴大,很多國家也逐漸的放松了對於數字加密貨幣的監管,更是有較多的國家,不但將區塊鏈技術的研發提上了日程,更是在數字加密貨幣上也開始了布局。   區塊鏈技術的最初應用和最成功的應用,都是比特幣,但是比特幣總量恒定,即使想要入局也只是通過交易或者挖礦的方式,比特幣市場顯然不能

短視頻行業的原罪為什麽都集中在抖音爆發

抖音最近的抖音,又被推到了風口浪尖之上。在和騰訊朋友圈、微博、UC、百度信息流等產品的輪番口水戰之中,抖音和頭條系產品自身的正當性開始受到了質疑。從被官媒和有關部門頻繁點名開始,到不斷湧現的因模仿抖音段子產生事故的社會新聞,再到最近疑因整容輟學被封殺的網紅溫婉。抖音似乎走上了負面消息比正面消息還多的“黑紅”之

Java 數組 定義一個數組獲取數組中的值和小值奇數個數和偶數個數

++ java 偶數 system += 最小值 dem [] style /** * 定義一個數組,獲取數組中的最大值和最小值 奇數個數和偶數個數 * */ package com.xuyigang1234.chp01; public class Demo8 {

I'm fine是外國人說的的謊話! 騙我們十幾年是時候揭露真相

大家好, 我是教你用簡單的英文, 表達複雜情況的華生     小學時學的: How are you? I'm fine,thank you,and you?   想必你一輩子都忘不了!   I'm fine外國人

利用Python多執行緒限制 http 真實請求時間或限制函式執行時間的裝飾器

  這段時間在製作一個爬蟲的時候發現了一個比較神奇的事情 python requests 包發起請求的時候設定 timeout 引數 竟然不起作用? what 你要弄啥么蛾子嘞,  後來各種找原因終於在別人的提醒下又看了下 requests 的文件才發

在頁面輸入文字資訊區域網內電腦連線的LED就會顯示文字資訊

前提:區域網,公用一個數據庫,實時重新整理(js程式碼) 思路: 1.在一個文字框內(編輯通知資訊)輸入資訊,點選一下提交,後臺就執行插入資料庫操作 2.這個頁面是每分鐘重新整理一次,通知欄就會呼叫資料庫裡面的內容,從而顯示在LED上面 3 這個頁面是專門給領導用的,不實現重新整理,

鐳射炸彈(求一個邊長為r的子矩陣內值的(不包括邊界))

問題 F: 鐳射炸彈 時間限制: 1 Sec  記憶體限制: 128 MB 題目描述 一種新型的鐳射炸彈,可以摧毀一個邊長為R的正方形內的所有的目標。現在地圖上有n(n≤10000)個目標,用整數xi,yi(0≤xi,yi≤5000)表示目標在地圖