【Code-Snippet】Permission權限

0. Thanks To

android 6.0權限全面詳細分析和解決方案java

1. 概述

在Android6.0及其以上,對權限進行了進一步限制。一些危險級別的權限,須要代碼中去向用戶申請才能使用,否則,會報異常:java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider,那麼問題來了,是否是全部之前發佈的app都會出現問題呢?答案是不會,只有那些targetSdkVersion設置爲23和23以上的應用纔會出現異常,在使用危險權限的時候系統必需要得到用戶的贊成才能使用,要否則應用就會崩潰。android

2. 權限的分類

  • 危險權限
Permission Group Permissions Desc描述
android.permission-group.CALENDAR android.permission.READ_CALENDAR 容許程序讀取用戶的日程信息
android.permission.WRITE_CALENDAR 寫入日程,但不可讀取
android.permission-group.CAMERA android.permission.CAMERA 容許訪問攝像頭進行拍照
android.permission-group.CONTACTS android.permission.READ_CONTACTS 容許應用訪問聯繫人通信錄信息
android.permission.WRITE_CONTACTS 寫入聯繫人,但不可讀取
android.permission-group.LOCATION android.permission.ACCESS_FINE_LOCATION 經過GPS芯片接收衛星的定位信息,定位精度達10米之內
android.permission.ACCESS_COARSE_LOCATION 經過WiFi或移動基站的方式獲取用戶錯略的經緯度信息,定位精度大概偏差在30~1500米
android.permission-group.MICROPHONE android.permission.RECORD_AUDIO 錄製聲音經過手機或耳機的麥克
android.permission-group.PHONE android.permission.READ_PHONE_STATE 訪問電話狀態
android.permission.CALL_PHONE 容許程序從非系統撥號器裏輸入電話號碼
android.permission.READ_CALL_LOG ''
android.permission.WRITE_CALL_LOG ''
com.android.voicemail.permission.ADD_VOICEMAIL ''
android.permission.USE_SIP 容許程序使用SIP視頻服務
android.permission.PROCESS_OUTGOING_CALLS 容許程序監視,修改或放棄播出電話
android.permission-group.SENSORS android.permission.BODY_SENSORS ''
android.permission-group.SMS android.permission.SEND_SMS 容許發送短信
android.permission.RECEIVE_SMS 容許接受短信
android.permission.READ_SMS 容許讀取短信
android.permission.RECEIVE_WAP_PUSH 接收WAP PUSH信息
android.permission.RECEIVE_MMS 接收彩信
android.permission.READ_CELL_BROADCASTS ''
android.permission-group.STORAGE android.permission.READ_EXTERNAL_STORAGE 容許訪問存儲設備
android.permission.WRITE_EXTERNAL_STORAGE 容許寫入存儲設備

3. 權限申請示例

檢查權限,而後判斷是否已經容許了,未容許就去申請:bash

String[] permissions = new String[] {
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};
int result = ContextCompat.checkSelfPermission(this, permissions[0]);
switch (result) {
    case PackageManager.PERMISSION_DENIED:
        ActivityCompat.requestPermissions(this, permissions, 0x02);
        break;
    case PackageManager.PERMISSION_GRANTED:
        //do some things
        break;
}
複製代碼

在 onRequestPermissionsResult 裏面接收結果,須要遍歷出當前 String[] permissions 返回的申請列表中的某一個權限,而後取出結果。do some things 應該包裝成一個方法,獲得權限後,就去作某件事情。ActivityCompat.shouldShowRequestPermissionRationale 返回值是,系統是否有顯示權限獲取的dialog,若是是false,就是什麼都沒有彈出來,則咱們須要主動去引導用戶去開啓權限,例如打開設置頁面。app

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 0x02:
            for (int i = 0; i < permissions.length; i++) {
                String permission = permissions[i];
                if (permission.equalsIgnoreCase(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    switch (grantResults[i]) {
                        case PackageManager.PERMISSION_DENIED:
                            boolean shouldShowTips = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0]);
                            if (!shouldShowTips)
                                Toast.makeText(this,"請到設置裏面開啓權限!", Toast.LENGTH_SHORT).show();
                            else
                                Toast.makeText(this,"您已經禁止了權限了", Toast.LENGTH_SHORT).show();
                            break;
                        case PackageManager.PERMISSION_GRANTED:
                            //do some things
                            break;
                    }
                }
            }
            break;
    }
}
複製代碼
相關文章
相關標籤/搜索