1. 程式人生 > >Android 6.0開始動態請求許可權

Android 6.0開始動態請求許可權

動態請求許可權

從Android 6.0(API 23)開始,允許使用者在應用執行時決定是否允許許可權,而不是在應用安裝的時候。這種方法簡化了應用的安裝過程,因為使用者在安裝或更新應用的時候不需要允許許可權。他也讓使用者對應用的功能有更多的控制;例如,使用者可以選擇給予相機應用相機的許可權但是不允許使用裝置位置的許可權。使用者可進入應用設定隨時撤銷許可權。

系統許可權被分為兩種型別,正常的(normal)和敏感的(dangerous):

  • 正常的許可權不會直接讓使用者的隱私處於危險中。如果你的應用在清單檔案中列入了正常的許可權,系統會自動允許這些許可權。

  • 敏感許可權給予應用方位使用者的機密資料。如果你的應用在清單檔案中列入危險類許可權,會明確地讓使用者對你的應用允許許可權。

在所有的Android版本中,你的應用需要在清單檔案中去申明它需要的正常的和危險的許可權。然而,宣告的影響是不同的,依賴於系統版本和你應用的目標SDK等級:

  • 如果裝置執行在Android 5.1或更低,或者你的應用的 target SDK是22或者更低;如果你在清單檔案中加入了敏感許可權,當他們在安裝應用的時候必須同意權限;如果他們不同意許可權,系統則不會安裝應用。

  • 如果裝置執行在Android 6.0或更高的版本,或者你的應用的 target SDK是23或者更高。應用必須在manifest檔案中加入許可權,而且在應用執行過程中必須在它需要的時候請求每一個危險的許可權。使用者可以允許或者拒絕每一個許可權,即使使用者拒絕了一個許可權的請求而應用可以在限制功能地繼續執行。

注意: 從Android6.0(API 23)開始,使用者可以在任何時候撤銷任何應用的許可權,即使應用目標SDK低於23。你應該測試你的用用驗證它正常的表現當它缺少需要的許可權,不管你的應用的target SDK等級是多少。

檢查許可權

如果你的應用需要一個敏感許可權,你必須檢查是否具有許可權當你每次執行一個操作需要一個許可權時。使用者總是可以自由地撤銷許可權,所以,即使應用昨天使用了相機,但是今天可能沒有相機許可權。

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

請求許可權

如果你的應用需要一個敏感許可權加入到manifest檔案中,他必須徵求使用者允許許可權。Android提供了一些方法讓你可以去請求一個許可權。呼叫這些方法會彈出一個標準的Android彈出框,你不能自定義。

解釋你的應用為什麼需要許可權

在某些情況中,你可能想要幫助使用者理解你的應用個為什麼需要一個許可權。例如,如果一個使用者執行一個相機應用,應用請求使用相機許可權,使用者對此並不會感到驚奇,但是,使用者並不理解為什麼應用想要訪問使用者的位置或者聯絡人。在你請求一個許可權之前,你應該考慮向用戶提供一個解釋。記住,如果你不想用解釋說服使用者;如果你提供太多的解釋,使用者可能發現應用令他沮喪並解除安裝它。

如果使用者已經關閉了許可權請求,你可能需要提供一個解釋。如果使用者堅持嘗試使用一個功能但需要請求一個許可權,但總是關閉許可權請求,可能說明使用者沒有理解應用為什麼需要該功能這個許可權。在這種情況下,去展示一個解釋可能是一個好主意。

為了幫助這種情況,使用者可能需要一個解釋,Android提供了一個實用的方法, 。如果應用以前請求過這個許可權並且被使用者拒絕了那麼這個方法會返回 true

注意: 如果使用者在許可權請求系統彈出框關閉許可權請求而且選擇不在提示,這個方法返回 false 。如果一個裝置已經禁止了應用的那個許可權這個方法也會返回 false

請求你需要的許可權

如果你的應用沒有你需要的許可權,你必須呼叫 方法去請求合適的許可權。你的應用通過許可權請求,會有一個整型的請求碼唯一標識這個許可權請求。這個方法是非同步的,當用戶操作這個彈出框後他會立即返回,系統呼叫應用的回撥方法跟結果。

下面程式碼是檢查應用是否有許可權去閱讀用的聯絡人,如果有需要就請求許可權:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

注意: 當你的應用呼叫 requestPermissions()方法時,系統會向用戶展示標準的對話方塊。你不能配置或者修對話方塊。如果你需要想用提供任何資訊或者解釋,你應該在呼叫 requestPermissions() 前去進行操作,正如 解釋你的應用為什麼需要許可權 中的描述。

處理許可權請求響應

當你的應用請求許可權時,系統會想用展示一個對話方塊。當用戶做出回覆後,系統會呼叫你應用的 方法。你的應用必須重寫這個方法,去找出許可權是否被允許。這個回撥介面跟requestPermissions()方法有一個相同的請求碼。例如,如果一個應用請求 訪問,他的回撥方法可能像下面這樣:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

對話方塊會展示你的應用需要的許可權所述的許可權組,它不會列出具體的許可權。例如,如果你請求 READ_CONTACTS 許可權,系統對話方塊僅僅說你的應用需要訪問裝置的聯絡人。對於每個許可權組使用者只需要允許一次。如果你的應用請求任何其他的許可權在那個組裡,系統會自動地允許他們。當你請求許可權時,如果使用者在系統對話方塊中已經明確的允許你的請求,系統呼叫onRequestPermissionsResult() 方法,並且通過 PERMISSION_GRANTED

注意: 你的應用仍然需要明確地請求每一個它需要的許可權,即使使用者已經允許了同組裡的另一個許可權。另外,在未來的Android版本中群組的許可權分組可能會有改變。你的程式碼不應該依賴特定的許可權是不是在一個組裡。

例如,假設你應用的manifest檔案中既有 READ_CONTACTS 許可權又有 WRITE_CONTACTS 許可權。如果你請求 READ_CONTACTS 並且使用者允許了改許可權,然後你請求 WRITE_CONTACTS ,系統會立即允許許可權而不和使用者互動。

如果使用者拒絕一個許可權請求,你的應用應該採取適當的處理。例如,你的應用可能展示一個對話方塊,解釋它為什麼需要許可權去執行使用者請求的操作。

當系統詢問使用者允許許可權時,使用者可以有選擇的告訴系統不用在此詢問許可權。在這種情況下,任何時候,應用使用 requestPermissions() 方法去在次請求許可權時,系統會立即拒絕請求。如果使用者已經明確的拒絕了你的請求,系統會呼叫 onRequestPermissionsResult() 方法並且通過PERMISSION_DENIED 。這意味著當你呼叫 requestPermissions() 方法時,你不能在使用者操作的地方產生預期的效果。

正常許可權(Normal Permissions)

在API 23中,下面許可權被定義為正常許可權

  • ACCESS_LOCATION_EXTRA_COMMANDS
  • ACCESS_NETWORK_STATE
  • ACCESS_NOTIFICATION_POLICY
  • ACCESS_WIFI_STATE
  • BLUETOOTH
  • BLUETOOTH_ADMIN
  • BROADCAST_STICKY
  • CHANGE_NETWORK_STATE
  • CHANGE_WIFI_MULTICAST_STATE
  • CHANGE_WIFI_STATE
  • DISABLE_KEYGUARD
  • EXPAND_STATUS_BAR
  • GET_PACKAGE_SIZE
  • INSTALL_SHORTCUT
  • INTERNET
  • KILL_BACKGROUND_PROCESSES
  • MODIFY_AUDIO_SETTINGS
  • NFC
  • READ_SYNC_SETTINGS
  • READ_SYNC_STATS
  • RECEIVE_BOOT_COMPLETED
  • REORDER_TASKS
  • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • REQUEST_INSTALL_PACKAGES
  • SET_ALARM
  • SET_TIME_ZONE
  • SET_WALLPAPER
  • SET_WALLPAPER_HINTS
  • TRANSMIT_IR
  • UNINSTALL_SHORTCUT
  • USE_FINGERPRINT
  • VIBRATE
  • WAKE_LOCK
  • WRITE_SYNC_SETTINGS

敏感許可權(Dangerous permissions)

Permission Group Permissions
CONTACTS READ_CONTACTS ,WRITE_CONTACTS, GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE, CALL_PHONE READ_CALL_LOG , WRITE_CALL_LOG , ADD_VOICEMAIL , USE_SIP, PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS RECEIVE_SMS , READ_SMS RECEIVE_WAP_PUSH , RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE

原文連結

鄙人英語能力有限,翻譯難免有誤,請讀者多多包含! 也歡迎指正。

相關推薦

Android 6.0開始動態請求許可權

動態請求許可權 從Android 6.0(API 23)開始,允許使用者在應用執行時決定是否允許許可權,而不是在應用安裝的時候。這種方法簡化了應用的安裝過程,因為使用者在安裝或更新應用的時候不需要允許許可權。他也讓使用者對應用的功能有更多的控制;例如,使用

Android 6.0系統動態請求系統相機許可權

1 private static final int TAKE_PHOTO_REQUEST_CODE = 1; 2 3 public static String takePhoto(Context context, int requestCode) { 4 Stri

Android 6.0以上動態獲取許可權

首先在清單檔案中註冊 然後在MainActivity.java中將許可權封裝到一個String陣列中 static final String[] PERMISSION = new String[]{ Manifest.permission.READ_PHONE_STATE,

android 6.0 以上 動態申請多個許可權

不囉嗦 直接上程式碼 第一步 首先在onCreate下判斷SDK版本  if (Build.VERSION.SDK_INT >= 23) {               //如果targetSDKVersion >= 23,那麼必須要申請到所需要的許可權,

解決Android拍照6.0以上動態獲取許可權問題

概述 在Android開發過程中,拍照或者從相簿中選擇圖片是很常見的功能。下面要說得這個案例比較簡單,使用者點選按鈕選擇拍照或者開啟相簿選擇圖片,然後將選中的圖片顯示在手機上。android6.0後,推出了動態許可權管理。以往我們將涉及到的許可權全部寫在清單檔案中,只要

談談Android 6.0動態許可權管理

1.前言 大家都知道Android 6.0的新特性之一就是應用許可權的管理。也就是說凡是涉及使用者隱私的許可權,使用者可以自己去設定管理了。然而在6.0以前,我們安裝一款APP是默認同意此APP所需的所有許可權(比如定位、訪問通訊錄),不同意就不能安裝。當然,

安卓6.0之後——動態獲取許可權封裝

轉載請註明出處    https://blog.csdn.net/lebang08/article/details/52751088 今天將專案中需要授權的地方,增加了判斷 -----------關於6.0許可權的封裝。 大家知道,在android6.0之後,谷歌為了更

解決Android 6.0以上的相機許可權適配問題

近期創業大潮中,幾個小夥伴,拼了命往前趕,這邊app一個月連帶著服務端一個人搞定,這幾天遇到一個問題 使用zxing掃碼的時候,CaptureActivity介面的相機不能使用,log一下,顯示camera為空,其實之前我一直懷疑是不是,Android 6.0不支援came

Android 6.0的執行時許可權 批量申請

Android 6.0,代號棉花糖,自發布伊始,其主要的特徵執行時許可權就很受關注。因為這一特徵不僅改善了使用者對於應用的使用體驗,還使得應用開發者在實踐開發中需要做出改變。 沒有深入瞭解執行時許可權的開發者通常會有很多疑問,比如什麼是執行時許可權,哪些是執行時

Android 6.0執行時獲取許可權詳解

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

android傳送簡訊填入手機號碼,6.0動態請求許可權撥打電話

//發簡訊填入號碼 Uri uri = Uri.parse("smsto:" + phone); Intent sendIntent = new Intent(Intent.AC

Android 6.0動態申請許可權時,許可權框閃一下就消失的問題;

Android 藍芽BLE開發需要位置許可權,不然掃描不到周圍的藍芽資訊; 位置許可權申請: if (Build.VERSION.SDK_INT < 23){return;} //判斷是否有許可權 if (ContextCompat.checkSelfPermis

解決Android 6.0動態新增許可權問題

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FE

Android 6.0 動態許可權申請

前言: 從Android 6.0(API 23)開始,對系統許可權做了很大的改變。在之前使用者安裝APP前,只是把APP需要使用的許可權列出來給使用者告知一下,APP安裝後都可以訪問這些許可權。從6.0開始,一些敏感許可權,需要在使用時動態申請,並且使用者可以選擇拒絕授權訪

Android動態許可權6.0以上及6.0以下動態許可權申請遇到的問題

今天來記錄一個問題,因為專案需要用到zxing,那就必須要用到攝像頭,那麼就需要動態的去申請許可權,先貼個6.0以上的申請許可權的程式碼 這個在網上隨便搜一搜都有很多程式碼塊 就不做過多的解釋了 今天主要討論的是在6.0以下遇到的一個問題 /** * 請求許可

一行程式碼搞定Android 6.0動態許可權申請

1、前言 從Android 6.0(API 23)開始,對系統許可權做了很大的改變。在之前使用者安裝APP前,只是把APP需要使用的許可權列出來給使用者告知一下,APP安裝後都可以訪問這些許可權。從6.0開始,一些敏感許可權,需要在使用時動態申請,並且使用者可

Android 6.0獲取IMEI號是出錯,動態獲取許可權

    之前更新了一個版本,獲取使用者的IMEI裝置號,本地手機測試沒問題,就放到伺服器上,結果有很多使用者反應,應用打不開。也不是全部使用者,只有少部分Android 6.0系統的使用者和一些root過的使用者,由於那不到使用者手機,只能從錯誤日誌中檢視。 出錯日誌:

Android 6.0動態許可權介紹與處理

一、Android 6.0許可權介紹 從 Android 6.0(API 級別 23)開始,使用者開始在應用執行時向其授予許可權,而不是在應用安裝時授予。 Android 6.0系統6.0以前,所有的許可權,訪問網路的許可權,讀取SD卡的許可權,訪問通訊錄,撥

Android 6.0許可權管理以及動態申請,以定位許可權為例

前言: 我們都知道現在手機系統已經到了很高的版本,在我們的Android6.0以後很多許可權都被列入危險許可權,都需要使用者手動去確認 1.我們先來看一下6.0以後被列為危險級別的一些許可權

Android 6.0: 動態許可權管理的解決方案

歡迎Follow我的GitHub, 關注我的CSDN. Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了使用者體驗, 同時也為程式設計師帶來新的負擔. 動態許可權管理就是這樣, 一方面讓使用者更加容易的控制自己的隱