1. 程式人生 > >Android M執行時許可權詳解

Android M執行時許可權詳解

好久之前在網上看到國外一篇關於M的許可權機制詳解,由於是英文的,剛好最近閒的沒事做,順手翻譯一下。

翻譯水平有限,湊合著看吧。

前幾天官方公佈了Android M的名字,最終版本也將在不久後釋出。

雖然Android還在不斷髮生著變化,最新M版本的更新和以往是完全不同的,因為有一些重要的更新,例如執行時許可權。令人驚奇的是,在Android開發社群這並沒有過多相關討論,即使這是相當重要而且可能會引起一些大麻煩。

這也正是我決定寫一篇部落格來討論這個主題的原因。趁現在還不算太晚,你將從這裡全面瞭解執行時許可權包括如何在程式碼中如何實現 。

新的執行時許可權

Andorid的許可權管理系統一直都是被關注最多的安全問題之一,因為一旦軟體被安裝就能在使用者沒有任何感知的情況下獲得所有申明的許可權 。

正因如此,一些意圖不軌的人能利用系統的這塊軟肋蒐集使用者隱私資訊,並用在不正當的途徑裡。

Android團隊當然知道這個令人緊急的事態,自Android問世7年後的今天,在Android6.0棉花糖版本里,當應用程式在安裝期間將不再被授予任何許可權(應該是指危險許可權),取而代之的是,應用程式必須在使用的時候向用戶申請所需許可權。


需要注意的是,申請許可權的Dialog並不會自動彈出,開發者必須手動申明呼叫,如果開發者申請的許可權沒有獲得使用者允許,則當使用該許可權相關功能的時候應用程式會突然丟擲異常導致崩潰


此外,使用者還能在任何時候通過手機內的設定模組來撤消應用程式已被授權的許可權。


估計你現在已經蛋碎了...如果你是個Android開發者,你應該會意識到程式邏輯已經發生了巨大的變化,你不能再像以前那樣進行開發,因為你必須去檢查每個許可權否則分分鐘給你崩潰!

正因如此,我需要提醒你這不是一件簡單的工作。雖然這對使用者來說是一件好事,但對我們開發者來說簡直就是噩夢,我們必須在下個階段採取行動,否則無論從短期還是長期角度來說這都是個巨大的問題。

儘管如此,新的執行時許可權機制只在應用程式的targetSdkVersion>=23時生效,並且只在6.0系統之上有這種機制,在低於6.0的系統上應用程式和以前一樣不受影響。

之前釋出/安裝的應用程式會怎樣?

新的執行時許可權可能已經讓你感到恐慌,你可能會問:“嘿~如果我的應用程式是在3年前就已經發布/安裝了,在6.0系統的裝置上是否也會崩潰?”

小夥子彆著急,Android團隊早就考慮過這種情況。如果應用程式的targetSdkVersion小於23,系統會預設其尚未適配新的執行時許可權機制,安裝後將和以前一樣不受影響:即使用者在安裝應用程式的時候預設允許所有被申明的許可權 !


喏,應用程式和以前一樣沒受影響。但是!你需要注意的是!使用者在安裝後仍然可以撤消任何許可權 !即使6.0系統會在使用者撤消許可權時給予警告,但是使用者仍然能執行撤消的操作!


那麼接下來你的腦子中就會提出一個問題:那這樣我的應用程式會崩潰麼?

Android團隊還是像上帝般仁慈滴~當應用程式targetSdkVersion小於23時,其某個功能在呼叫已被使用者撤消的許可權時是不會丟擲任何異常的,只是該功能不會有任何反應,對於功能的返回值來說,在這種情況下它只會return0或者空。


但是不要高興的太早,雖然應用程式在呼叫功能的時候不會崩潰,但是有可能因為該功能不正常的返回值(0或null)引起崩潰!

好訊息(到現在為止來看)是因為這種機制是全新的,我相信很少會有使用者去這麼做,萬一他們這麼做了,那他們就必須要接受相應的結果。

但是從長遠角度來看,我相信會有大量的使用者會選擇禁止某些許可權。我們的應用程式在新的裝置上無法完美執行,這是不能忍的!

為了使程式能完美執行,你最好修改程式去適配新的許可權機制,並且現在就開幹!

對於哪些還沒有完美適配執行時許可權機制的應用程式來說,千萬不要將targetSdkVersion提升到23,否則你會有大麻煩喲,只有當你通過了所有測試才能將其targetSdkVersion設定為23。

警告:現在你新建專案的時候,Studio會預設將targetSdkVersion設定為23,如果你還沒完全適配執行時許可權機制,我建議你還是將targetSdkVersion設定為22。

自動授權的許可權(預設無需申請的許可權)

下面列出的許可權代表應用程式在安裝的時候會自動被允許使用且無法被撤消的許可權,我們稱之為Normal Permission(PROTECTION_NORMAL):

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

你只需要在清單檔案AndroidManifest.xml 中申明即可,無需再申請且無法被使用者撤消。

讓你的應用程式適配執行時許可權機制

是時候去讓我們的程式完美適配執行時許可權機制了。首先將compileSdkVersion 和 targetSdkVersion 設定為23.

1 2 3 4 5 6 7 8 9 android { compileSdkVersion 23 ... defaultConfig { ... targetSdkVersion 23 ... }

舉個例子,我們嘗試實現一個新增聯絡人的功能。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 private static final String TAG = "Contacts"; private void insertDummyContact() { // Two operations are needed to insert a new contact. ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(2); // First, set up a new raw contact. ContentProviderOperation.Builder op = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null); operations.add(op.build()); // Next, set the name for the contact. op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "__DUMMY CONTACT from runtime permissions sample"); operations.add(op.build()); // Apply the operations. ContentResolver resolver = getContentResolver(); try { resolver.applyBatch(ContactsContract.AUTHORITY, operations); catch (RemoteException e) { Log.d(TAG, "Could not add a new contact: " + e.getMessage()); catch (OperationApplicationException e) { Log.d(TAG, "Could not add a new contact: " + e.getMessage()); } }

上述程式碼需要 WRITE_CONTACTS 許可權。如果沒有去申請就呼叫該功能,程式會突然崩潰。

下一步是按照老辦法在 AndroidManifest.xml 中新增對應的許可權。

1 <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

下一步,我們必須實現一個檢測許可權是否被允許的功能, 如果沒有被允許就需要彈出Dialog向用戶申請該許可權,然後你才能執行下面新增聯絡人的操作。

下面的列表代表權限組Permission Group(即同類許可權被劃分為同一組許可權,申請許可權時可以直接申請許可權組)

如果一個許可權組中任一許可權被允許,同組內其他許可權也同時被允許使用。這種情況下,一旦 WRITE_CONTACTS 被授權,應用許可權將同時允許READ_CONTACTS 和 GET_ACCOUNTS

用於檢測和申請許可權的程式碼在 Activity的 checkSelfPermission 和requestPermissions 方法裡, 這些都屬於API23新增的方法。

1 2 3 4 5 6 7 8 9 10 11 final private int REQUEST_CODE_ASK_PERMISSIONS = 123; private void insertDummyContactWrapper() { int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS); if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_ASK_PERMISSIONS); return; } insertDummyContact(); }

如果許可權已被授權, insertDummyContact() 將會立即執行,否則,requestPermissions 將會被執行,此時會彈出下圖Dialog去申請許可權:

無論許可權申請被允許還是拒絕,Activity的 onRequestPermissionsResult 方法都會被呼叫,通過第三個引數 grantResults 可以獲取申請結果,如下所示:

相關推薦

Android M執行許可權

好久之前在網上看到國外一篇關於M的許可權機制詳解,由於是英文的,剛好最近閒的沒事做,順手翻譯一下。 翻譯水平有限,湊合著看吧。 前幾天官方公佈了Android M的名字,最終版本也將在不久後釋出。 雖然Android還在不斷髮生著變化,最新M版本的更

Android M執行許可權

之前我們的App需要許可權,只需在manifest中申明即可,使用者安裝後,一切申明的許可權都可來去自如的使用。但是Android M把許可權管理做了加強處理,在manifest申明瞭,在使用到相關功能時,還需重新授權方可使用。當然,不是所有許可權都需重新授權,所以就把這些

Android程式執行許可權與檔案系統許可權,與普通許可權及危險許可權的區別

面試時遇到這樣的題目   問題來的太突然,完全沒有準備,結果我想到了android 6.0之後推出的 normal permissions 和 dangerous permissions 並且把這兩者之間的關係答了一下,而且還舉了個例子,現在想想,真是丟人 關於普通

Android 6.0執行獲取許可權

最近在工作過程中會遇到,明明已經在AndroidManifest.xml中配置了許可權,但是就是沒有作用,百度了之後才發現現在在應用系統大於等於6.0的手機上面,需要動態的獲取許可權。就是當你需要這個許可權的時候,需要手機給使用者一個提示選擇是否同意開啟這個許

Android M 新的執行許可權開發者需要知道的一切

http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ android M 的名字官方剛釋出不久,最終正式版即將來臨! android在不斷髮展,最近的更新 M 非常不同,一些主要的變化例如執行時許

Linux 檔案和目錄的讀寫執行許可權

首先了解一個ls -l 檔案的每列含義 [[email protected] ~]# ls -l a -rw-r–rw- 1 test002 tester 279103 9月 2 13:21 a 下面介紹每列含義: (1)第一列:檔案型別和許可權,這部分稍後重

Android permission許可權

        許可權是一種安全機制。Android許可權主要用於限制應用程式內部某些具有限制性特性的功能使用以及應用程式之間的元件訪問。在Android開發中,基本上都會遇到聯網的需求,我們知道都需要加上聯網所需要的許可權: <uses-perm

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

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

Android 6 0 執行許可權處理

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

Android 學習之《第一行程式碼》第二版 筆記(十五)執行許可權

一、執行時許可權功能 使用者不需要在安裝軟體的時候一次性授權所有申請的許可權,而是可以在軟體的使用過程中再對某一項許可權申請進行授權。 分類:普通許可權和危險許可權 我們在進行執行時許可權處理時使用的是許可權名,但是使用者一旦同意授權了,那麼該許可權所對應的

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

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

Android(執行緒二) 執行緒池

  我們在ListView中需要下載資源時,贊不考慮快取機制,那麼每一個Item可能都需要開啟一個執行緒去下載資源(如果沒有執行緒池),如果Item很多,那麼我們可能就會無限制的一直建立新的執行緒去執行下載任務,最終結果可能導致,應用卡頓、手機反應遲鈍!最壞的結果是,使用者

以呼叫系統相機拍照為例瞭解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學習筆記-Android6.0執行許可權

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

Android 6.0 執行許可權處理

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

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

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

android 6.0執行許可權應用之相簿圖片選取

public class MainActivity extends AppCompatActivity { public static final int REQUEST_CODE=200; public static final int REQUEST_C

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

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