1. 程式人生 > >如何一次性獲取多個動態許可權

如何一次性獲取多個動態許可權

    android6.0及以上版本區分了:普通許可權和危險許可權。普通許可權可以直接在清單檔案裡面申請,
    危險許可權不僅要在清單檔案裡面申請,還要在程式碼裡面動態獲取。如果你僅僅動態獲取了,
    沒有在清單檔案裡面申明,在你返回的回撥方法裡面會被拒絕給許可權。
    我這裡的思路就是,先判斷版本號是否大於android6.0,
    然後判斷你的操作需要的許可權哪些是沒有給的,沒有給的就去動態獲取,給了的就不用
    接著,彈出對話方塊提示使用者,需要這些許可權的原因,讓使用者去選擇,是否給該許可權
    最後,系統也會彈出一個對話方塊,讓使用者去確認,是否給許可權。
    注意:如果這裡,我們自己的對話方塊,使用者選擇了是,然後沒有彈系統的對話方塊讓使用者去選擇,
    就直接被拒絕了,那就是前面我說過的,在清單檔案裡面沒有註冊該許可權。
    這裡,我以拍照為例。呼叫方式如下:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
String[] permission = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};//需要的許可權
        String title = "相機許可權不可用";
        String content = "由於上傳照片需要獲取相機相關許可權,獲取相簿功能;\n否則,您將無法正常使用相機功能";
        initPermission(permission,title,content);
  • 1
  • 2
  • 3
  • 4
    1、首先:判斷版本號是否大於android6.0
for迴圈判斷哪些需要獲取的許可權
  • 1
  • 2
    /**
     * 初始化使用者許可權
     * @param permissions 需要的許可權
     * @param title 我們自己對話方塊的標題
     * @param content 我們自己對話方塊的內容
     */
    public void initPermission(String[] permissions, String title, String content) {
        // 版本判斷。當手機系統大於 23 時,才有必要去判斷許可權是否獲取
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> permissionList = new
ArrayList<>(); for (int i = 0; i < permissions.length; i++) {//for迴圈把需要授權的許可權都新增進來 if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) { //未授權就進行授權 permissionList.add(permissions[i]); } } //如果permissionList是空的,說明沒有許可權需要授權,什麼都不做,該幹嘛幹嘛,否則就發起授權請求 if (!permissionList.isEmpty()) { showDialogTipUserRequestPermission(permissionList, title, content); } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
    2、彈出對話方塊,讓使用者選擇是否給許可權
  • 1
  • 2
// 提示使用者該請求許可權的彈出框
    private void showDialogTipUserRequestPermission(final List<String> permissionList, String title, String content) {
        new android.support.v7.app.AlertDialog.Builder(this)
                .setTitle(title)
                .setMessage(content)
                .setPositiveButton("立即開啟", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startRequestPermission(permissionList);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).setCancelable(false).show();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
    3、提交許可權的請求
  • 1
  • 2
// 開始提交請求許可權
    private void startRequestPermission(List<String> permissionList) {
        if (!permissionList.isEmpty()) {//不為空就進行授權申請
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(this, permissions, permissionsRequestCode);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
    4、回撥方法
  • 1
  • 2
// 使用者許可權 申請 的回撥方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == permissionsRequestCode) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults.length > 0) {//安全寫法,如果小於0,肯定會出錯了
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        switch (grantResult){
                            case PackageManager.PERMISSION_GRANTED://同意授權0
                                break;
                            case PackageManager.PERMISSION_DENIED://拒絕授權-1
                                Utils.ShowToast(context,permissions[i]+"許可權獲取失敗");
                                finish();
                                break;
                        }
                    }
                }
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
    這個回撥裡面的grantResults,就是該許可權返回的code碼。我這裡是一次獲取多個許可權,
    用的for迴圈,如果你只用申請一個,就不需要for迴圈,只用比較一次即可。
    demo就不用上傳了,把這裡的程式碼拷貝過去就可以直接用了。放到你的基類裡面。
    需要的時候呼叫就可以了。
  • 1
  • 2
  • 3
  • 4
  • 5

相關推薦

如何一次性獲取動態許可權

android6.0及以上版本區分了:普通許可權和危險許可權。普通許可權可以直接在清單檔案裡面申請, 危險許可權不僅要在清單檔案裡面申請,還要在程式碼裡面動態獲取。如果你僅僅動態獲取了, 沒有在清單檔案裡面申明,在你返回的回撥方法裡面會被拒絕給許可權。

關於動態許可權申請,動態許可權申請

public final static int REQUEST_READ_PHONE_STATE = 1; 加上這個定義,忘記新增到程式碼片了,我的問題,這次補上了。 protected void onCreate(Bundle savedInstanceState)

獲取input標籤,並動態改變input標籤的name屬性

網上找了很多,都不如意,後來安裝了個谷歌瀏覽器除錯,發現問題:list陣列中的值居然變少了,但不知道為什麼會這樣,求大神解答。原理我不知道,但是稍微修改下程式碼,還是實現了 <script ty

python基礎一 ------如何獲取字典相同的鍵

class dom 集合 pre app wke 生成 參數 tool 需求: 足球賽第一場進去統計 {"A":3,"B":2,"C":1}足球賽第二場進去統計 {"A":3,"C":1}足球賽第二場進去統計 {"A":2,"B":2}統計每場都有進球的人----&g

KindEditor獲取textarea文本框的值並判斷非空

div 編輯器 fill star fontsize 取值 pop 獲取 sta kindeditor官網:http://kindeditor.net/demo.php 如何獲取多個KindEditor中textarea文本框的值,方式很多種(帶有HTML標簽)。

jquery怎樣獲取復選框的值?

target ssa cti contain 樣式 val value css樣式 UNC jquery的遍歷方法可以獲取復選框所欲的選中值 1 2 $("input:checkbox:checked").each(function(index,element

python如何獲取excel單元格的值

load 解決 info ace 多層嵌套 traceback spa 數據 多個 一. 獲取多個單元格的值報錯:AttributeError: ‘tuple‘ object has no attribute ‘value‘ 需要讀取的sample.xlsx 代碼讀取的是

jmeter 正則獲取返回token至本地文件,並跨線程組調用

mage 表達 processor csv文件 參數 res 例如 通過 mark 1、打開jmeter,創建setup Thread Group對於setup Thread Group和tearDown Thread Group來說,從字面意思上來看就是安裝線程組和卸載線

matlab實現一次性實現文件夾圖片轉化為.mat文件

img mage 標簽 rgb end 參考 strcmp microsoft rcm %這裏是主函數:命名為readImg.m; clc;clear; %---read_image; filepath = ‘G:\人臉重建\data\src_all\‘;%圖片路徑可以根

在js中無法獲取id值為demo的問題

例如程式碼中: <script> $(document).ready(function(){ $("#demo").hover(function(){ $("h1").css("background-color","yellow"); },function(){

springmvc介面引數中,獲取物件

需求:儲存或者修改時,前端傳多個相同型別的物件,後臺獲取 方法1:(麻煩,不推介) 前臺 :前端資料,通過在名稱加序號,譬如:[{"name_0":"can","sex_0",1},{"name_1":"phil","sex_0",0}] 後臺:通過遍歷,request.get

海思3531獲取攝像頭在整個螢幕的畫面

要想獲取整個攝像頭畫面在整個螢幕的畫面只需要比平常的操作多一步即可,例如通常海思SDK通常提供的VENC例子裡的流程是:VI->VPSS->VENC,而我們把他修改成VI->VPSS->虛擬VO->VENC,這樣我們就可以獲取所有攝像頭在螢幕顯示的畫面。虛擬VO配置如下

Webdriver獲取元素

官方通過如下程式碼獲取多個元素: Java程式碼   List<WebElement> inputs = driver.findElements(By.xpath("//input"));&n

JQuery 同時獲取標籤的指定內容並儲存為陣列

文章來自:原始碼線上https://www.shengli.me/jquery/271.html       此時的list1的陣列中   每個元素已經不是'li'物件,如此執行控制檯會報錯: &nbs

nuxt-相同目錄下的動態路由跳轉

    在專案的新需求中,對url規則更改,這裡拿課程頁面舉例,   檔案目錄:pages/course/_course.vue----頁面規則需要更改為---->瀏覽器顯示 : http://主站地址/course    或者     h

jQuery:同一class下,如何獲取div的中的最大高度值

第一:要理解Jq中的獲取高度的三個方法height()、 innerHeight()、outerHeight() height():height innerHeight():height+padding outerHeight():height+padding+bo

迴圈獲取input標籤的值

<script> var str = ''; $(".a").each(function(index,element){        str += $(this).val()+','; }); str = str.substr

postgresql Java JDBC 一次性傳入引數到 in ( ?) - multple/list parameters

經常不清楚需要傳入多少個引數到 IN () 裡面,下面是簡單方法:   方法 1 - in ( SELECT * FROM unnest(?)) )         Integer[] ids={1,2,3};  

Spring Task 定時器如何在專案啟動時一次性註冊定時器任務

使用情景:前面的一篇文章已經說明了如何通過外部訪問,在不停伺服器的情況下動態的修改cron引數值,從而達到動態的修改定時器的任務,有需要的可以參考文章: 動態修改引數cron的值來實現Spring自帶定時器動態的執行任務,但是還有一種情況就是能不能不是通過外部修改,而是直接

SVN 一次性提交目錄中檔案的方法

情況一:將專案中未加入版本控制的檔案提交到版本庫。  在使用WINDOW下的SVN客戶端工具時,在提交一個專案的檔案時,如果有未加入版本庫的檔案,這時可以先將未加入的檔案選中,然後一起提交。  但在LINUX命令列中,如果一個專案中新建立了一個檔案new.php,那麼我們可以使用如下命令來進行版本的提交。