Android進階之光——Android6.0新特性

Android 6.0新特性

Android6.0主要特性概述

  1. 應(yīng)用權(quán)限管理
  2. Android Pay
  3. 指紋支持
  4. Doze電量管理
  5. App Links
  6. Now on Tap

運行時權(quán)限機制

Android6.0系統(tǒng)默認為targetSdkVersion小于23的應(yīng)用授予了所申請的所有權(quán)限。

Normal Permissions 與 Dangerous Permission

Google將權(quán)限分為兩類:

  1. Normal Permissions:這類權(quán)限不涉及用戶隱私,是無須用戶進行授權(quán)的。比如手機震動、訪問網(wǎng)絡(luò)等這些權(quán)限只需要再AndroidManifest.xml中簡單聲明就好,安裝時就會授權(quán)。無須每次使用時都檢查權(quán)限。而且用戶不能取消以上授權(quán)
  2. Dangerous Permission 一般會涉及用戶隱私,需要用戶進行授權(quán)
    Dangerous Permission是以分組的形式給出的,同一組的任何一個權(quán)限被授權(quán)了,其他權(quán)限也自動被授權(quán)。
  3. 實現(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,這時候我們可以彈出提示框進行提示

?著作權(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)容