1. 程式人生 > >Android開發必知:6.0許可權,官方分析

Android開發必知:6.0許可權,官方分析

1.這個新的執行時許可權僅當我們設定targetSdkVersion 23(這意味著你已經在23上測試通過了)才起作用,當然還要是M系統的手機。app在6.0之前的裝置依然使用舊的許可權系統。

如果app的targetSdkVersion 低於 23,那將被認為app沒有用23新許可權測試過,那將被繼續使用舊有規則:使用者在安裝的時候不得不接受所有許可權,安裝後app就有了那些許可權咯!然後app像以前一樣奔跑!注意,此時使用者依然可以取消已經同意的授權!使用者取消授權時,android 6.0系統會警告,但這不妨礙使用者取消授權。

問題又來了,這時候你的app崩潰嗎?

善意的主把這事也告訴了android小組,當我們在targetSdkVersion 低於23的app呼叫一個需要許可權的函式時,這個許可權如果被使用者取消授權了的話,不丟擲異常。但是他將啥都不幹,結果導致函式返回值是null或者0.

2.程式碼沒有成功改為支援最新執行時許可權的app,不要設定targetSdkVersion 23 釋出,否則你就有麻煩了。只有當你測試過了,再改為targetSdkVersion 23 。
警告:現在你在android studio新建專案,targetSdkVersion 會自動設定為 23。如果你還沒支援新執行時許可權,我建議你首先把targetSdkVersion 降級到22

3.許可權組:
同一組的任何一個許可權被授權了,其他許可權也自動被授權。例如,一旦WRITE_CONTACTS被授權了,app也有READ_CONTACTS和GET_ACCOUNTS了。

許可權分組官方表格如下:
這裡寫圖片描述

下面我們來看具體的使用方法:

1.請求要申請的許可權

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
    ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission
.READ_PHONE_STATE},2); }else { startActivity(new Intent(this,MainActivity.class)); finish(); }

2.請求後的回撥方法,根據返回的結果碼執行操作

//動態許可權申請後系統的回撥方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode){
        case MY_PERMISSIONS_REQUEST:
            for (int i = 0; i < grantResults.length; i++) {
                //檢查許可權是否被拒絕
                                if(grantResults[i]==PackageManager.PERMISSION_DENIED) {
                    Toast.makeText(SplashActivity.this, "本應用需要申請讀寫sdcard許可權來訪問本地檔案", Toast.LENGTH_SHORT).show();
                    return;
                }
            }
            break;
    }
    Intent intent = new Intent(SplashActivity.this,MainActivity.class);
    startActivity(intent);
    finish();
}

3.要注意這個方法,使用者允許或拒絕返回值的型別

/**
 * 使用者第一次拒絕後,下一次,返回true,應該提示使用者為什麼需要這個許可權,新增說明
 * 使用者第二次請求許可權時,使用者拒絕了,並選擇了不再提醒,返回false
 * 裝置的策略禁止當前應用獲取這個許可權的授權,返回false
 *
 * 注意:第二次請求許可權時候才有選項“不再提醒”,如果使用者一直拒絕,但沒有選擇不再提醒,下次請求許可權時候,
 * 會繼續有不再提醒的許可權
 */
@Override
public boolean shouldShowRequestPermissionRationale(String permission) {
    return super.shouldShowRequestPermissionRationale(permission);
}

以上就是Google官方的許可權申請方法,這裡總結下實際使用時候需要的注意點:

1.只請求你需要的許可權:減少請求的次數,或用intent來代替,讓其他的應用來處理。
防止一次請求太多的許可權或請求次數太多,使用者可能對你的應用感到厭煩。

2.在應用啟動的時候,最好先請求應用必須的一些許可權,不是必須的,在使用的時候,才請求(如一些附帶許可權),需要自己整理,管理一下自己應用的許可權分類:

2.1 普通許可權(normal permissions):只需要在androidmanifest.xml中宣告相應的許可權,在安裝應用時,會預設獲得許可。並且使用者不能修改許可權許可。(只需要在AndroidManifest.xml中簡單宣告這些許可權就好,安裝時就授權。不需要每次使用 時都檢查許可權,而且使用者不能取消以上授權。)

2.2 需要申請的許可權(dangerous permissions):

2.2.1 必要許可權:最好在應用啟動的時候,進行請求許可的一些許可權(主要是應用中主要功能需要的許可權)
2.2.2 附帶許可權:不是應用主要功能需要的許可權(如:分享圖片時,需要讀取應用的通訊錄等等)

3.解釋你的應用為什麼需要這些許可權:在請求之前requestPermissions().,提示使用者,讓使用者不會感到困惑

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

當第一次請求許可權申請被拒絕後再進行第二次申請時,對話方塊中會多出一個 不再詢問 的複選框。如果勾選了該複選框並且拒絕請求,那麼以後將無法再申請該許可權。也就是說在呼叫 requestPermissions() 後,onRequestPermissionsResult() 會立刻被呼叫並且申請結果為 PERMISSION_DENIED 。 其實這個時候還是有一根救命稻草的。

判斷是否勾選不再詢問

 //首先需要判斷使用者是否勾選了不再詢問。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case MY_PERMISSIONS_APPLY:
                for (int i = 0; i < grantResults.length; i++) {
                    //判斷許可權的結果,如果有被拒絕,就return
                    if (grantResults[i] == PackageManager.PERMISSION_DENIED){
                        if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
                                permissions[i])){
                            showToast("點選許可權,並開啟全部許可權");
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getPackageName(), null);
                            intent.setData(uri);
                            startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
                    }
ActivityCompat 位於 support.v7 包中,因為執行時許可權是 6.0 的新特性,使用該類可以省略對版本的判斷當權限申請被拒絕並且shouldShowRequestPermissionRationale() 返回 false 就表示勾選了不再詢問。轉到設定介面現在我們唯一能做的就是跳轉到我們 App 的設定介面,讓使用者手動開啟許可權了。
也就是這幾行程式碼,上面已經貼出,方便大家參考:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);

當然,你也可以先彈出對話方塊詢問使用者是否要授予許可權,然後再跳轉。
跳轉到設定介面呼叫的是 startActivityForResult() 而不是 startActivity() 。
在 onActivityResult() 中沒有必要對 resultCode 進行判斷,因為使用者只能通過返回鍵才能回到我們的 App 中,所以 resultCode 總是為 RESULT_CANCEL。
在 onActivityResult() 中還需要對許可權進行判斷,因為使用者有可能沒有授權就返回了!

相關推薦

Android開發6.0許可權官方分析

1.這個新的執行時許可權僅當我們設定targetSdkVersion 23(這意味著你已經在23上測試通過了)才起作用,當然還要是M系統的手機。app在6.0之前的裝置依然使用舊的許可權系統。 如果app的targetSdkVersion 低於 23,那將被認

譯作《50 Android Hacks》中文版《打造高質量Android應用Android開發的50個訣竅》

目  錄推薦序序致謝關於本書關於原書封面插圖第1章 活用佈局Hack 1 使用weight屬性實現檢視的居中顯示1.1 合用weightSum屬性和layout_weight屬性1.2 概要1.3 外部連結Hack 2 使用延遲載入以及避免程式碼重複2.1 使用標籤避免程式碼重複 2.2 通過ViewStub

android 6.0許可權onRequestPermissionsResult回撥不執行問題

許可權是目前APP必不可少的,這裡介紹一下onRequestPermissionsResult回撥不執行問題。 一,正常使用android 6.0許可權: 思路: 1.檢查判斷 如果應用具有此許可權,方法將返回PackageManager.PERMISSION_GRA

android 6 0許可權全面詳細分析和解決方案

原文: http://www.2cto.com/kf/201512/455888.html http://blog.csdn.net/yangqingqo/article/details/48371123 http://inthecheesefactory.com/blog/things-y

android 6.0許可權全面詳細分析和解決方案

原文: http://www.2cto.com/kf/201512/455888.html http://blog.csdn.net/yangqingqo/article/details/48371123 http://inthecheesefactory.com/blog

android 6.0許可權onRequestPermissionsResult回撥不執行

一、正常的使用方法 如果應用具有此許可權,方法將返回PackageManager.PERMISSION_GRANTED,並且應用可以繼續操作。 如果應用不具有此許可權,方法將返回PERMISSION_DENIED,且應用必須明確向用戶要求許可權。

前端開發瀏覽器相容(一)——IE雙邊距

一、  不同瀏覽器的標籤預設的padding,margin不同解決:css裡*{margin:0;padding:0;}備註:這個是最常見的也是最易解決的一個瀏覽器相容性問題,幾乎所有的css檔案開頭都

【 專欄 】- Android開發

Android開發必知必會 介紹Android開發過程中必須瞭解的基礎知識,基礎的四大元件,自定義View,事件傳遞,啟動流程,系統框架。儘量能給初學的朋友們勾勒出Android的輪廓,同時自己也能進行一定的梳理。

Android 6.0許可權機制及開發流程詳解

許可權機制變更的背景 在Android6.0之前,app在安裝時會提示使用者此app需要使用哪些許可權,但使用者只能選擇同意或拒絕安裝,而不能單獨對某項許可權進行授予或拒絕。只要使用者選擇了安裝,即表示使用者接受了app對這些許可權的使用,如果使用者不希望app獲取某些涉及隱

android 6.0許可權開發---拍照開啟相簿問題

android6.0的許可權機制改得跟ios類似,兩個系統之間互相模仿也是好事,取長補短。在某些許可權需要用到的時候,要先詢問使用者。 國內各大android系統對於許可權的設定機制都不大一樣,但大部分都是一些常用的許可權預設是開啟的,一些是預設關閉了,即使你在Andr

Android開發——Android 6.0許可權管理機制詳解

0.前言最近在研究所實習,我負責維護Android手機取證專案的Android客戶端,有客戶反映我們的APP在Android6.0無響應,經過除錯發現SD卡讀寫許可權許可權被拒絕。但明明是在AndroidManifest.xml檔案中宣告過的。查了很多資料才知道Android

Android開發6.0許可權的封裝

import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri;

Android程式報錯Anroid 6.0 許可權問題java.io.FileNotFoundException: ……:open failed: EACCES (Permission denied)

異常 java.io.FileNotFoundException: /storage/emulated/0/Video/ekwing_main_paren.apk(你的檔案路徑): open fai

AndroidAndroid 6.0許可權機制及開發流程詳解

許可權機制變更的背景 在Android6.0之前,app安裝時會提示使用者此app需要使用哪些許可權,但使用者不能單獨對某項許可權進行授權或拒絕,只要使用者選擇了安裝,即表示使用者接受了app對這些許可權的使用,如果使用者不希望app獲取某些涉及隱私的資訊,例如讀取

android開發6.0許可權適配

寫部落格只是為了方便記憶,希望自己能夠堅持下去。 在android開發中,如果專案的targetSdkVersion >= 23,在手機版本為android6.0+的手機上執行時,某些危險的許可權需要使用者授權,如果使用者不同意,而直接執行某些程式碼

Android ble掃描版本高於6.0後需要定位許可權

參考部落格:http://blog.csdn.net/sun6223508/article/details/50505936 p private final int REQUEST_FINE_LOCATION = 1; private void mayRequestLoc

Location許可權因系統版本不同6.0許可權對話方塊沒有7.08.0正常開發時要注意

1、一個獲取Location許可權引發的刺激,就這三個Location許可權 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission an

android 6.0許可權管理

轉載 https://blog.csdn.net/android2me/article/details/69525975 private void checkPermission() { //檢查許可權(NEED_PERMISSION)是否被授權 PackageManager.

android 6.0 + 許可權之 打電話

下面看看我怎麼調出去的… 第一步,我們還是要在AndroidManifolest.xml裡面新增 如果你沒有判斷請求許可權會報以下錯誤 AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jie.demo, PI

Android 幾行程式碼解決6.0以上許可權適配問題

APK 將libray模組複製到專案中,或者直接在build.gradle中依賴: allprojects { repositories { maven { url 'https://jitpack.io' } } } depende