Android 6.0新特性
Android6.0主要特性概述
- 應(yīng)用權(quán)限管理
- Android Pay
- 指紋支持
- Doze電量管理
- App Links
- Now on Tap
運行時權(quán)限機制
Android6.0系統(tǒng)默認為targetSdkVersion小于23的應(yīng)用授予了所申請的所有權(quán)限。
Normal Permissions 與 Dangerous Permission
Google將權(quán)限分為兩類:
- Normal Permissions:這類權(quán)限不涉及用戶隱私,是無須用戶進行授權(quán)的。比如手機震動、訪問網(wǎng)絡(luò)等這些權(quán)限只需要再AndroidManifest.xml中簡單聲明就好,安裝時就會授權(quán)。無須每次使用時都檢查權(quán)限。而且用戶不能取消以上授權(quán)
- Dangerous Permission 一般會涉及用戶隱私,需要用戶進行授權(quán)
Dangerous Permission是以分組的形式給出的,同一組的任何一個權(quán)限被授權(quán)了,其他權(quán)限也自動被授權(quán)。 - 實現(xiàn)支持運行時權(quán)限
下面通過一個打電話的例子來說明如何支持運行時權(quán)限。我們需要先設(shè)置build.gradle中的targetVersion大于23
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.probuing.androidlight"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
- Manifest.xml
<uses-permission android:name="android.permission.CALL_PHONE"/>
- Java
private void callPhone() {
//先檢查是否有打電話的權(quán)限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//沒有打電話權(quán)限,申請打電話權(quán)限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
//已經(jīng)有權(quán)限 執(zhí)行打電話
call();
}
}
private void call() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + "10086"));
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
if (requestCode==1) {
if (grantResults[0]== PackageManager.PERMISSION_GRANTED) {
//權(quán)限已經(jīng)獲取
call();
}else{
Toast.makeText(this, "權(quán)限被拒絕", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
如果沒有權(quán)限則彈出提示框進行權(quán)限申請,onRequestPermissionsResult就是申請權(quán)限的回調(diào),如果用戶選擇允許,則調(diào)用call方法,如果選擇拒絕就會執(zhí)行else彈出提示。如果選擇拒絕,則下一次還會彈出權(quán)限申請的提示框,這一次會多出一個選項。叫作 不在詢問。如果我們勾選了該選項,則下一次就不會彈出權(quán)限申請?zhí)崾究颍侵苯诱{(diào)用onRequestPermissionResult,回調(diào)結(jié)果為最后一次用戶的選擇
如何處理不再詢問
如果用戶選擇了不在詢問,那么每次我們調(diào)用需要訪問該權(quán)限的API時都會失效。所以我們需要使用shouldShowRequestPermissionRationale方法。這個方法幫助開發(fā)者向用戶解釋權(quán)限情況,如果用戶選擇不在詢問,則shouldShowRequestPermissionRationale方法會返回false,這時候我們可以彈出提示框進行提示