Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 6.0 運行時權限 處理

Android 6.0 運行時權限 處理

編輯:關於Android編程

盡管Android正在被不斷開發,但Android 6.0是完全不同的,對於Android 6.0的幾個主要的變化,查看查看官網的這篇文章:

http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html
其中當然包含Runtime Permissions。

本篇文章目的就是讓開發者能輕松解決一些運行時權限的問題。

Android M 運行時權限

新的權限獲取方式除了要求像之前版本一樣在AndroidManifest文件中靜態申請之外,應用還需根據需要請求權限,方式采用向用戶顯示一個請求權限的對話框。這些被動態申請的權限可以在系統設置中被手動關閉。另外,對於類別為NORMAL(正常)的權限,仍然只需要在AndroidManifest文件中靜態申請,系統安裝時會直接獲取,對於Dangerous(危險)權限則需要在Java代碼中作處理。

Normal Permissions如下:

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_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如下(權限組的形式):

group:android.permission-group.CONTACTS
    permission:android.permission.WRITE_CONTACTS
    permission:android.permission.GET_ACCOUNTS
    permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
    permission:android.permission.READ_CALL_LOG
    permission:android.permission.READ_PHONE_STATE
    permission:android.permission.CALL_PHONE
    permission:android.permission.WRITE_CALL_LOG
    permission:android.permission.USE_SIP
    permission:android.permission.PROCESS_OUTGOING_CALLS
    permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
    permission:android.permission.READ_CALENDAR
    permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
    permission:android.permission.CAMERA

group:android.permission-group.SENSORS
    permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
    permission:android.permission.ACCESS_FINE_LOCATION
    permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
    permission:android.permission.READ_EXTERNAL_STORAGE
    permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
    permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
    permission:android.permission.READ_SMS
    permission:android.permission.RECEIVE_WAP_PUSH
    permission:android.permission.RECEIVE_MMS
    permission:android.permission.RECEIVE_SMS
    permission:android.permission.SEND_SMS
    permission:android.permission.READ_CELL_BROADCASTS

注:如果你申請某個Dangerous Permissions,假設你的app早已被用戶授權了同一組的某個危險權限,那麼系統會立即授權,而不需要用戶去點擊授權。開發的時候不要對權限組有過多依賴,盡可能對每個危險權限都進行正常的權限申請。

下面我們來進行Android 6.0的適配工作:

1.Android 6.0 運行時權限處理

(1)在AndroidManifest文件中添加需要的權限(我們假設權限xx);

(2)在Java代碼中進行動態授權:

private static final int REQUEST_XX_PERMISSION=10;

/**
 * 這個方法在需要進行授權的地方調用
 */
private void requestXxPermission(){
    //判斷系統版本
    if (Build.VERSION.SDK_INT >= 23) {
        int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.xx);
        //判斷這個權限是否已經授權過
        if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
            //判斷是否需要 向用戶解釋,為什麼要申請該權限,該方法只有在用戶在上一次已經拒絕過你的這個權限申請才會調用。
            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.xx))
                Toast.makeText(this,"Need xx permission.",Toast.LENGTH_SHORT).show();
            /**
             * 參數1 Context
             * 參數2 需要申請權限的字符串數組,支持一次性申請多個權限,對話框逐一詢問
             * 參數3 requestCode 主要用於回調的時候檢測
             */
            ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.xx},REQUEST_BLUETOOTH_PERMISSION);
            return;
        }else{
        }
    } else {
    }
}

(3)授權回調處理

@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){
    switch(permsRequestCode){
        case REQUEST_XX_PERMISSION:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //授權成功
            } else {
                //授權拒絕
            }
            break;
    }
}

對於權限的申請結果,首先驗證requestCode定位到你的申請,然後驗證grantResults對應於申請的結果,這裡的數組對應於申請時的第二個權限字符串數組。如果你同時申請兩個權限,那麼grantResults的length就為2,分別記錄你兩個權限的申請結果。如果申請成功,就可以做你的事情了。

2.案例一 適配Android 6.0 藍牙

(1)在AndroidManifest文件中添加需要的權限;



  
  

(2)在Java代碼中進行動態授權(這裡以藍牙權限為例):

private static final int REQUEST_BLUETOOTH_PERMISSION=10;

private void requestBluetoothPermission(){
    //判斷系統版本
    if (Build.VERSION.SDK_INT >= 23) {
        int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
        //判斷這個權限是否已經授權過
        if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
            //判斷是否需要 向用戶解釋,為什麼要申請該權限
            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION))
                Toast.makeText(this,"Need bluetooth permission.",Toast.LENGTH_SHORT).show();
            ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_BLUETOOTH_PERMISSION);
            return;
        }else{
        }
    } else {
    }
}

(3)此處為簡化處理就不作授權回調處理了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved