fbpx
Android 6.0的Permission權限設計

Android 6.0的Permission權限設計

Android 6.0(API Level 23)開始,應用程式的權限有新的機制,API 23開始,權限分為兩大類型,一般權限(Normal Permission)與危險權限(Dangerous Permission)。

Android 6.0的Permission權限

Android 6.0(API Level 23)開始,應用程式的權限有新的機制,在API 23之前(Android 4.x、5.x)應用程式在安裝時會要求所有會使用到的權限,如INTERNET網路連線、READ_CONTACT讀取聯絡人資料或是WRITE_EXTERNAL_STORAGE寫入外部儲存裝置(如SD Card)等,在API 23開始,權限分為兩大類型,一般權限(Normal Permission)與危險權限(Dangerous Permission)。

當應用程式在開發時,其「targetSdkVersion」目標開發版本設定為23或以上時,且在Android 6.0以上的手機環境執行時,對於權限相關的運作方式說明如下。

一般權限與危險權限

這兩種權限同樣都要在AndroidManifest.xml中使用<uses-permission>宣告,不同的是,危險權限除此之外,在執行應用程式時,如果程式碼中存取了危險權限,還會出現請求權限的對話框,要求使用者允許存取資料,下圖是存取危險權限之一的拍照權限出現的對話框:

A4506

危險權限依照功能分為以下幾個組別:

序號 群組 項目 說明
1 CALENDAR日曆 READ_CALENDAR 讀取日曆
WRITE_CALENDAR 寫入日曆
2 CAMERA CAMERA 相機拍照功能
3 CONTACTS聯絡人 READ_CONTACTS 讀取聯絡人
WRITE_CONTACTS 寫入聯絡人
GET_ACCOUNTS 取得手機帳號
4 LOCATION位置 ACCESS_FINE_LOCATION 取得精確位置
ACCESS_COARSE_LOCATION 取得大約位置
5 MICROPHONE麥克風 RECORD_AUDIO 錄製聲音
6 PHONE電話 READ_PHONE_STATE 讀取通話狀態
CALL_PHONE 撥出電話
READ_CALL_LOG 讀取通話記錄
WRITE_CALL_LOG 寫入通話記錄
ADD_VOICEMAIL 新增語音留言
USE_SIP 使用SIP網路電話
PROCESS_OUTGOING_CALLS 存取撥出電話
7 SENSORS感應器 BODY_SENSORS 讀取體感資料
8 SMS簡訊 SEND_SMS 傳送簡訊
RECEIVE_SMS 接收簡訊
READ_SMS 讀取簡訊
RECEIVE_WAP_PUSH 接收WAP推播訊息
RECEIVE_MMS 接收多媒體簡訊
9 STORAGE儲存 READ_EXTERNAL_STORAGE 讀取外部儲存
WRITE_EXTERNAL_STORAGE 寫入外部儲存

危險權限若在執行過程獲得使用者授權其中一種權限後,便自動取得該群組內的所有權限,例如使用者允許第3組中的READ_CONTACTS後,應用程式也一併取得CONTACTS群組內的WRITE_CONTACTS權限。

這些權限值全都定義在android.Manifest.permission中,使用時可以在類別中以import語法導入:

import android.Manifest;

在類別內以下列方式取得權限值(以字串定義):

Manifest.permission.WRITE_EXTERNAL_STORAGE

或是直接import static,如下:

import static android.Manifest.permission.*;

即可在類別中直接使用permission內定義的所有權限常數,如下圖:

A4508

執行中要求權限

權限檢查是Android 6.0(API 23)後才有的,請確認「app模組」的build.gradle內宣告的complieSdkVersion為23以上,且targetSdkVersion亦為23以上,如下:

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'
    
    defaultConfig {
        applicationId "com.tom.card"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled false
    }
    略

程式中使用由「Support v4」類別庫所提供的「ActivityCompat」類別,import語法如下:

import android.support.v4.app.ActivityCompat;
import static android.Manifest.permission.*;

首先,在程式中若想存取屬於危險權限的資源之前,需先檢查是否已經取得使用者的授權,檢查權限語法:

int permission = ActivityCompat.checkSelfPermission(this,
         Manifest.permission.WRITE_EXTERNAL_STORAGE);
  • 已擁有權限-PERMISSION_GRANTED

代表應用程式目前已獲得使用者允許使用該權限。

  • 無權限-PERMISSION_DENIED

應用程式目前無該權限。

接下來應設計程式判斷回傳的狀態值,並設計擁有與無權限的程式碼,程式片段如下:

if (permission != PackageManager.PERMISSION_GRANTED) {
    //未取得權限,向使用者要求允許權限
}else{
    //已有權限,可進行檔案存取
}

向使用者請求權限

ActivityCompat類別亦提供向使用者請求權限的類別方法「requestPermissions」,方法的規格如下:

ActivityCompat.requestPermissions( Context context,
        String[] permissions, int requestCode )
第一個參數傳入Context物件,第二個字串陣列則是欲要求的權限,第三個int是本次請求的辨識編號,當使用者決定後返回onRequestPermissionsResult方法時的辨認號碼,因此,應在類別中定義符合其功能的常數名稱,以提高程式可讀性,例如請求外部儲存時,常數名稱為「REQUEST_EXTERNEL_PERMISSION」。
程式碼範例如下:

請參考「Android APP 高效入門」

相關文章:

Hank Tom

專長為程式語言、雲端服務開發,Linux系統管理, 任職:利拓科技 技術長,海林行動科技 技術總監 輔仁大學 兼任助理教授 , 為 Android高效入門>深度學習、CentOS 7建置、管理與伺服器架設實戰、Java網路程式設計、雲端網頁程式設計-Google App Engine應用實作 等書作者

This Post Has 6 Comments

  1. Avatar

    您好,請問writeFild()一直出現紅字是為什麼呢?

    1. Avatar

      這個方法是要自己設計,把寫入檔案的程式碼設計在裏面。

  2. Avatar

    您好 Hank Tom :

    請教一下,我用service開個udp listen在背景執行
    可是幫螢幕關掉時,我就收不到udp的訊息了
    請問我該朝什麼方向去找關鍵字呢??
    省電模式我也解除了、wifi優化我也解除了
    用app版的netstat看我監聽的port也還開著
    謝謝

    是漏開了什麼權限嗎?

      1. Avatar

        請問有一個通知存取權 要如何獲得?
        就像『HTC Ice View』通知 這種權限
        可以看line跳出來的方式

發佈留言

×
×

Cart