Android 6.0新特性
Android6.0主要特性概述
- 應(yīng)用權(quán)限管理
- Android Pay
- 指紋支持
- Doze電量管理
- App Links
- Now on Tap
運(yùn)行時(shí)權(quán)限機(jī)制
Android6.0系統(tǒng)默認(rèn)為targetSdkVersion小于23的應(yīng)用授予了所申請(qǐng)的所有權(quán)限。
Normal Permissions 與 Dangerous Permission
Google將權(quán)限分為兩類(lèi):
- Normal Permissions:這類(lèi)權(quán)限不涉及用戶(hù)隱私伴嗡,是無(wú)須用戶(hù)進(jìn)行授權(quán)的簇爆。比如手機(jī)震動(dòng)、訪問(wèn)網(wǎng)絡(luò)等這些權(quán)限只需要再AndroidManifest.xml中簡(jiǎn)單聲明就好斜姥,安裝時(shí)就會(huì)授權(quán)个扰。無(wú)須每次使用時(shí)都檢查權(quán)限。而且用戶(hù)不能取消以上授權(quán)
- Dangerous Permission 一般會(huì)涉及用戶(hù)隱私精绎,需要用戶(hù)進(jìn)行授權(quán)
Dangerous Permission是以分組的形式給出的祟霍,同一組的任何一個(gè)權(quán)限被授權(quán)了杏头,其他權(quán)限也自動(dòng)被授權(quán)。 - 實(shí)現(xiàn)支持運(yùn)行時(shí)權(quán)限
下面通過(guò)一個(gè)打電話的例子來(lái)說(shuō)明如何支持運(yùn)行時(shí)權(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) {
//沒(méi)有打電話權(quán)限醇王,申請(qǐng)打電話權(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);
}
如果沒(méi)有權(quán)限則彈出提示框進(jìn)行權(quán)限申請(qǐng),onRequestPermissionsResult就是申請(qǐng)權(quán)限的回調(diào)崭添,如果用戶(hù)選擇允許寓娩,則調(diào)用call方法,如果選擇拒絕就會(huì)執(zhí)行else彈出提示呼渣。如果選擇拒絕棘伴,則下一次還會(huì)彈出權(quán)限申請(qǐng)的提示框,這一次會(huì)多出一個(gè)選項(xiàng)徙邻。叫作 不在詢(xún)問(wèn)排嫌。如果我們勾選了該選項(xiàng),則下一次就不會(huì)彈出權(quán)限申請(qǐng)?zhí)崾究蜱掷纾侵苯诱{(diào)用onRequestPermissionResult淳地,回調(diào)結(jié)果為最后一次用戶(hù)的選擇
如何處理不再詢(xún)問(wèn)
如果用戶(hù)選擇了不在詢(xún)問(wèn)怖糊,那么每次我們調(diào)用需要訪問(wèn)該權(quán)限的API時(shí)都會(huì)失效。所以我們需要使用shouldShowRequestPermissionRationale方法颇象。這個(gè)方法幫助開(kāi)發(fā)者向用戶(hù)解釋權(quán)限情況伍伤,如果用戶(hù)選擇不在詢(xún)問(wèn),則shouldShowRequestPermissionRationale方法會(huì)返回false遣钳,這時(shí)候我們可以彈出提示框進(jìn)行提示