1. 程式人生 > >淺談Android6.0執行時許可權

淺談Android6.0執行時許可權

引言

從 Android 6.0(API 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。這種許可權機制可以讓使用者更好的管理應用的許可權,保障使用者隱私。

系統許可權分類

  • 正常許可權不會直接給使用者隱私權帶來風險。如果您的應用在其清單中列出了正常許可權,系統將自動授予該許可權。
  • 危險許可權會授予應用訪問使用者機密資料的許可權。如果您列出了危險許可權,則使用者必須明確批准您的應用使用這些許可權。危險許可權共分為9組24個,也就是說只要使用者允許了每一組中的一條許可權。就代表他允許了這個組中的全部許可權。
    這裡寫圖片描述

注意事項

  1. 在 Android 5.1(API 22)或更低版本,並且應用的 targetSdkVersion 是 22 或更低版本,則系統會在安裝時要求使用者授予許可權。(沿用之前的許可權系統)
  2. 即使在安裝時已經授予應用所有許可權,在Android 6.0之後依然可以通過 “Setting” 來關閉已經授予的許可權。
  3. 在請求許可權時,系統只告訴使用者應用需要的許可權組,而不告知具體許可權。
  4. 如果在未檢查授權的情況下,直接使用危險許可權,會導致程式Crash。
  5. 使用 v4 包中的 ContextCompat 處理許可權(v13 包中的FragmentCompat),不需要考慮版本問題。

實現方式

話不多說直接看程式碼

// 宣告一個數組,用來儲存所有需要動態申請的許可權。這裡寫的是同時申請多條許可權,如果你只申請一條那麼你就在數組裡寫一條許可權好了
    String[] permissions = new String[]{
            Manifest.permission
.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA}; // 同時我們可以宣告一個集合,用來儲存使用者拒絕授權的許可權。 List<String> mPermissionList = new ArrayList<>();
private void checkPermission() {
        mPermissionList.clear();
        /**
         *PackageManager.PERMISSION_GRANTED 表示有許可權, PackageManager.PERMISSION_DENIED 表示無許可權。
         * 判斷哪些許可權未授予
         * 以便必要的時候重新申請
         */
        for (String permission : permissions) {
        //判斷所要申請的許可權是否已經授權
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(permission);
            }
        }
        /**
         * 判斷儲存委授予許可權的集合是否為空
         */
        if (!mPermissionList.isEmpty()) {
            String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//將List轉為陣列
            ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);//請求指定授權
        } else {//未授予的許可權為空,表示都授予了
        }
    }
//重寫onRequestPermissionResult方法來處理授權結果
 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                for (int i = 0; i < grantResults.length; i++) {
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                        //判斷是否勾選禁止後不再詢問
                        //如果應用之前請求過此許可權但使用者拒絕了請求,此方法將返回 true。
                        boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permissions[i]);
                        if (showRequestPermission) {
                       //這裡可以做相關操作,我這裡是寫的是重新申請許可權
                            checkPermission();//重新申請許可權
                            return;
                        } else {
                            //做相關操作。。。
                        }
                    }
                }
                break;
            default:
                break;
        }
    }

總結

其實仔細想想,動態許可權申請其實也就那麼幾句話。多熟悉一下,應該可以很快掌握。對了最後還有一點,你要申請的動態許可權不要忘了在清單檔案中也要,靜態的申明一下。不然還是會報錯的。。。。。。

相關推薦

Android6.0執行許可權

引言 從 Android 6.0(API 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。這種許可權機制可以讓使用者更好的管理應用的許可權,保障使用者隱私。 系統許可權分類 正常許可權不會直接給使用者隱私權帶來風險。如果您的應用

Android學習筆記-Android6.0執行許可權

Android許可權機制,在Android6.0之前,其實一直很簡單,在AndroidManifest.xml中進行許可權宣告,通過一個Intent呼叫即可。 以打電話為例: <uses-permission android:name="andro

Android6.0執行許可權處理-超簡單封裝

之前除錯的時候,出現了一個問題,就是當我開啟二維碼掃描介面的時候,對於一部分手機一直不會出現那個掃描框,這點我也很是鬱悶,這不好整啊,畢竟二維碼介面是用的別人的,怎麼改啊?這個時候我分析了一下原因,最後知道只有部分6.0的手機才會出現這種情況,那麼這就簡單了。下

這可能是最精簡的Android6.0執行許可權處理,70行程式碼的工具類。附:各種許可權詳細處理

0x00:前言 對於Android6.0執行時許可權的處理方式網上有很多,包括註解,RxJava等等。一直沒有正面提到我關心的問題--如果我不在Activity或者Fragment裡面,需要執行時許可權該怎麼去做?導致我開始一直以為執行時許可權的處理必需要在Activity

Android6.0執行許可權-sd卡許可權處理方式

我們的app一般都會需要快取和一些圖片的儲存,當然我們的目錄可以是自己的私有目錄, getExternalCacheDir 或者 getCacheDir 是不需要許可權的,但是如果需要在sd卡下儲存呢,此時需要 WRITE_EXTERNAL_STORAGE 許可權.實際上

android6.0執行許可權完美封裝

前幾天看了郭大神的執行時許可權的專講,深受啟發,由於現在基於目前專案中的執行時許可權封裝的還不是那麼完美,趁著郭神建議的還是歷歷在目。於是把它完整的敲了下來。並在此基礎上新增上自己的一些見解,封裝成一個完整的demo,希望與大家進行交流與。 在這裡我進行了簡單的在acti

Android6.0執行許可權

一、執行時許可權 所謂執行時許可權,指的是在Android6.0及以上版本中,在app執行時才請求相關許可權,從而讓每項許可權都在使用者知情的情況下被授權(當然使用者可以拒絕)。而不同於Android6.0之前在安裝app時告知使用者獲取全部許可權。 關於許

Android6.0執行許可權,拒絕了許可權還返回獲取成功

如題:禁用、詢問的許可權,居然還返回許可權獲取成功 推薦一個很好的專案:AndPermission 不用回來感謝了喂! 這個問題在專案中,一直存在, 主要是第三方廠商各種改,返回的狀態不正常

Android6.0執行許可權-----AndPermission的使用

最近才開始用AndPermission庫,感覺非常不錯,在使用的過程中,順便就將它的用法寫下來吧。 首先是AndPermission庫的引入,通過新增依賴即可: dependencies { ...compile 'com.yanzhenjie:permissi

Android6.0執行許可權處理(專案中使用到的一種形式,沒有使用第三方庫)

相信大家都知道Android6.0之後的許可權申請跟之前的版本有一個很大的差別,那就是任何危險許可權都必須經過使用者的手動選擇是否接受來做相應的操作,而Android6.0之前安裝應用的過程中是預設選

android6.0的新特性之執行許可權處理解析

一.相關介紹 新的許可權機制更好的保護了使用者的隱私,Google將許可權分為兩類,一類是Normal Permissions,這類許可權一般不涉及使用者隱私,是不需要使用者進行授權的,比如手機震動、訪問網路等;另一類是Dangerous Permission

Android 6.0執行許可權勾選不再詢問後該如何處理?

Android 6.0執行時許可權勾選不再詢問後該如何處理? 當第一次請求許可權申請被拒絕後再進行第二次申請時,對話方塊中會多出一個 不再詢問 的複選框。如果勾選了該複選框並且拒絕請求,那麼以後將無法再申請該許可權。也就是說在呼叫 requestPermissions() 後,onRequest

Android 6 0 執行許可權處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 6 0 執行許可權處理完全解析

                     一、概述ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。當然非常推薦閱讀官網許可權相關文章:本文也是在上述文章基礎上理解、實驗以及封裝。二、執行時許可權的變化及特點對於6.0以下的許可權及在安裝的時候,根據許可權宣告產生一個

以呼叫系統相機拍照為例瞭解Android 6.0執行許可權

首先扯點別的,聽說這個週末是好天氣,想約她一起去公園賞賞梅花,只有我自己估計她也不一定去啊,哈哈。 在android6.0及以上系統,Android在安裝一個應用的時候不再需要列出一大堆許可權,讓使用者點選同意以後才可以安裝。Instead, 當應用在執行的時

談談Android 6.0執行許可權理解

前言  谷歌在2015年8月份時候,釋出了Android 6.0版本,代號叫做“棉花糖”(Marshmallow ),其中的很大的一部分變化,是在使用者許可權授權上,或許是感覺之前預設授權的不合理,現在6.0出來,使得使用者許可權授權變得合理。這可能也是參考IOS系統的,只有在使用者需要使用許可權的時候,才

Android 6.0執行許可權申請和一些坑

1.概述 大家知道在Android6.0(Api23)之前,使用者許可權的申請都是在AndroidManifest.xml 宣告的,而在6.0之後,對某些涉及到使用者隱私的許可權可在執行時根據使用者的需要動態授予。如果你的應用設定targetSdkVersio

Android 6.0 執行許可權處理

執行時許可權介紹 Android 6.0在我們原有的AndroidManifest.xml宣告許可權的基礎上, 又新增了執行時許可權動態檢測,以下許可權都需要在執行時判斷: 執行時許可權處理 Android6.0系統預設為targetSdkVersion小於23的應用預設授予了所申請的所有許可權,

Android 6.0 執行許可權管理最佳實踐

這是一篇遲來的部落格,Android M已經發布一年多了(6.0的變化),在Android M中許可權系統被重新設計,發生了顛覆性的變化,很多人把握不好這個變化,一是對這個許可權策略和套路還沒有摸透,二是沒有一個很好的實踐來支撐,在我的技術開發群裡很多人問我

6.0執行許可權與targetSdkVersion選擇

targetSDKVersion 簡單來說就代表著你的App能夠適配的系統版本,意味著你的App在這個版本的手機上做了充分的 前向 相容性處理和實際測試。其實我們寫程式碼時都是經常幹這麼一件事,就是 if(Build.VERSION.SDK_INT >= 23) {