Android6.0運行時權(quán)限

1.概述

 隨著Android 6.0 7.0 我們開發(fā)者所要應(yīng)對的主要就是新版本SDK帶來的一些變化,既然是程序員那么我們肯定就特別關(guān)注開發(fā)部分的變化,其中之一就是權(quán)限處理。那么在6.0及以上版本我們的危險權(quán)限都需要在運行的時候去申請,之前都是在清單文件中配置即可,現(xiàn)在就不行了需要加代碼申請。



2.運行時權(quán)限的檢測

2.1. Android6.0之后的權(quán)限差別

對于6.0以下的權(quán)限及在安裝的時候,根據(jù)權(quán)限聲明產(chǎn)生一個權(quán)限列表,用戶只有在同意之后才能完成app的安裝。而在6.0以后,我們可以直接安裝,當(dāng)app需要權(quán)限是會給予用戶提示用戶可以選擇同意和拒絕。 新的權(quán)限機(jī)制更好的保護(hù)了用戶的隱私,Google將權(quán)限分為兩類,一類是Normal Permissions,這類權(quán)限一般不涉及用戶隱私,是不需要用戶進(jìn)行授權(quán)的,比如訪問網(wǎng)絡(luò)等;另一類是Dangerous Permission,一般是涉及到用戶隱私的,需要用戶進(jìn)行授權(quán),比如讀取sdcard、打電話等等。

下面列出 Android 中所有的危險權(quán)限,一共是9組24個權(quán)限。 權(quán)限組名 權(quán)限名稱

CALENDAR(日歷) READ_CALENDAR WRITE_CALENDAR CAMERA

(相機(jī)) CAMERA CONTACTS

(聯(lián)系人) READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS LOCATION

(位置) ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION MICROPHONE

(麥克風(fēng)) RECORD_AUDIO PHONE

(手機(jī)) READ_PHONE_STATE CALL_PHONE ERAD_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

??????? 危險權(quán)限都是一組一組的,這是個什么概念呢?又或是有什么用呢?如果app運行在Android 6.x的機(jī)器上,對于授權(quán)機(jī)制是這樣的。如果你申請某個危險的權(quán)限,假設(shè)你的app早已被用戶授權(quán)了同一組的某個危險權(quán)限,那么系統(tǒng)會立即授權(quán),而不需要用戶去點擊授權(quán)。比如你的app對READ_CONTACTS已經(jīng)授權(quán)了,當(dāng)你的app申請WRITE_CONTACTS時,系統(tǒng)會直接授權(quán)通過。此外,對于申請時彈出的dialog上面的文本說明也是對整個權(quán)限組的說明,而不是單個權(quán)限



2.2. 相關(guān)代碼,以打電話為例

2.2.1.我們需要去檢測該權(quán)限有沒有背用戶授予過,如果沒有則需要申請打電話權(quán)限,如果有授予過可以直接撥打電話。

ContextCompat.checkSelfPermission:檢測權(quán)限

ActivityCompat.requestPermissions:申請權(quán)限

// ContextCompat.checkSelfPermission() // 方法返回值為PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。 // 當(dāng)返回GRANTED表示有該權(quán)限,DENIED表示沒有該權(quán)限。

?if(ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){

// 沒有該權(quán)限 申請打電話權(quán)限 // 三個參數(shù) 第一個參數(shù)是 Context , 第二個參數(shù)是用戶需要申請的權(quán)限字符串?dāng)?shù)組,第三個參數(shù)是請求碼 主要用來處理用戶選擇的返回結(jié)果

ActivityCompat.requestPermissions(this,new String[]{"Manifest.permission.CALL_PHONE"},CALL_PHONE_REQUEST_CODE);

}else {

?// 有該權(quán)限,直接打電話

?Intent intent = new Intent(Intent.ACTION_CALL);

Uri data = Uri.parse("tel:" + 137XXXXXXXX);

intent.setData(data); startActivity(intent);

}

2.2.2. 處理回調(diào)   如果用戶同意或是拒絕那么會回調(diào)onRequestPermissionsResult()

@Override

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

??? if(requestCode == CALL_PHONE_REQUEST_CODE){

??????????? if (grantResults !=null&&grantResults[0] == PackageManager.PERMISSION_GRANTED) {

?????????????????? // Permission Granted 通過 打電話

??????????????????? ?Intent intent = new Intent(Intent.ACTION_CALL);

???????????????????? Uri data = Uri.parse("tel:" + 137XXXXXXXX);

???????????????????? intent.setData(data); startActivity(intent);

????????????? } else {

??????????????????? // Permission Denied 被拒絕 Toast.makeText(this,"權(quán)限被拒絕了",Toast.LENGTH_SHORT).show();

????????????????}

??????? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容