欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android動(dòng)態(tài)權(quán)限申請(qǐng)實(shí)現(xiàn)步驟分解

 更新時(shí)間:2023年04月03日 08:52:47   作者:別偷我的豬_09  
對(duì)于一些危險(xiǎn)權(quán)限在AndroidManifest清單文件中申請(qǐng)之后,還需要得到用戶的許可并打開,才算是真正的開啟了這個(gè)權(quán)限。所以可以使用動(dòng)態(tài)申請(qǐng)權(quán)限,對(duì)于某個(gè)功能,如果需要開啟某個(gè)權(quán)限,在用戶使用它之前,彈窗提示用戶是否要開啟這個(gè)權(quán)限

Google 在 Android 6.0 開始引入了權(quán)限申請(qǐng)機(jī)制,將所有權(quán)限分成了正常權(quán)限和危險(xiǎn)權(quán)限。App 每次在使用危險(xiǎn)權(quán)限時(shí)需要?jiǎng)討B(tài)的申請(qǐng)并得到用戶的授權(quán)才能使用。

權(quán)限分類

系統(tǒng)權(quán)限分為兩類:正常權(quán)限和危險(xiǎn)權(quán)限。

正常權(quán)限:不會(huì)直接給用戶隱私帶來危險(xiǎn)。如果你在其清單中列出了正常權(quán)限,系統(tǒng)將自動(dòng)授予該權(quán)限。

危險(xiǎn)權(quán)限:授予應(yīng)用訪問用戶機(jī)密數(shù)據(jù)的權(quán)限。如果你在清單文件中列出了危險(xiǎn)權(quán)限,則用戶必須明確批準(zhǔn)你的應(yīng)用使用這些權(quán)限。那么危險(xiǎn)權(quán)限有那些?日歷(CALENDAR)、相機(jī)(CAMERA)、通訊錄(CONTACTS)、位置(LOCATION)、撥號(hào)(PHONE)、短信(SMS)和存儲(chǔ)(STORAGE)等。

<!-- 權(quán)限組:CALENDAR == 日歷讀取的權(quán)限申請(qǐng) -->
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<!-- 權(quán)限組:CAMERA == 相機(jī)打開的權(quán)限申請(qǐng) -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 權(quán)限組:CONTACTS == 聯(lián)系人通訊錄信息獲取/寫入的權(quán)限申請(qǐng) -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<!-- 權(quán)限組:LOCATION == 位置相關(guān)的權(quán)限申請(qǐng) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 權(quán)限組:PHONE == 撥號(hào)相關(guān)的權(quán)限申請(qǐng) -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 權(quán)限組:SMS == 短信相關(guān)的權(quán)限申請(qǐng) -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<!-- 權(quán)限組:STORAGE == 讀取存儲(chǔ)相關(guān)的權(quán)限申請(qǐng) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

申請(qǐng)以上權(quán)限時(shí),除了要在清單文件中添加權(quán)限,還需要通過代碼動(dòng)態(tài)申請(qǐng)。

動(dòng)態(tài)權(quán)限核心函數(shù)

1. 檢測(cè)權(quán)限

checkSelfPermission(@NonNull String permission)

2. 申請(qǐng)權(quán)限

requestPermissions(@NonNull String[] permissions, int requestCode)

3. 處理結(jié)果回調(diào)

onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)

4. 是否需要顯示 UI 界面提示用戶為什么需要這個(gè)權(quán)限

shouldShowRequestPermissionRationale(@NonNull String permission)

簡(jiǎn)易實(shí)現(xiàn)案例

步驟1:在 AndroidManifest.xml 添加要申請(qǐng)的權(quán)限。這里以存儲(chǔ)權(quán)限為例

<!-- STORAGE == 讀取存儲(chǔ)相關(guān)權(quán)限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

步驟2:封裝一個(gè) requestPermission 方法來動(dòng)態(tài)檢測(cè)和申請(qǐng)權(quán)限

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermission();
    }

requestPermission() 函數(shù)里會(huì)先檢測(cè)存儲(chǔ)權(quán)限,如果沒開啟則動(dòng)態(tài)申請(qǐng)存儲(chǔ)權(quán)限。

private void requestPermission() {
        // checkSelfPermission() 檢測(cè)權(quán)限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
            //TODO 申請(qǐng)存儲(chǔ)權(quán)限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    PERMISSION_REQUEST_CODE);
        }
    }

注意:這個(gè) demo 里只申請(qǐng)了一個(gè)權(quán)限,當(dāng)我們需要申請(qǐng)多個(gè)權(quán)限時(shí),可以往requestPermissions 里的第二個(gè)參數(shù)添加其它需要的權(quán)限,因?yàn)樗揪褪且粋€(gè) String 數(shù)組,且也要在 AndroidManifest里添加。

new String[]{Manifest.permission.READ_EXTERNAL_STORAGE
                    ,Manifest.permission.CAMERA}

步驟3:處理用戶選擇的結(jié)果(“允許” / “拒絕”),重寫 onRequestPermissionsResult()方法。

//TODO 處理權(quán)限結(jié)果回調(diào)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            //用戶點(diǎn)擊了“確定” == grantResults[0] == PackageManager.PERMISSION_GRANTED)
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i("TAG", "onRequestPermissionsResult granted");
            } else {
                Log.i("TAG", "onRequestPermissionsResult denied");
                // TODO 用戶拒絕權(quán)限申請(qǐng),則彈出警示框
                showWaringDialog();
            }
        }
    }

步驟4:當(dāng)用戶拒絕權(quán)限,則彈出警示框,并在用戶點(diǎn)擊“確定”后直接退出頁面。因?yàn)闆]有存儲(chǔ)權(quán)限肯定不能使用該應(yīng)用的。

/**
     * 用戶拒絕權(quán)限的警示
     */
    private void showWaringDialog() {
        new AlertDialog.Builder(this)
                .setTitle("警告!")
                .setMessage("請(qǐng)前往設(shè)置->應(yīng)用->權(quán)限管理->打開存儲(chǔ)權(quán)限,否則無法正常使用!")
                .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //TODO 一般情況下如果用戶不授權(quán)的話,功能時(shí)無法運(yùn)行的,則直接退出
                        finish();
                    }
                }).show();
    }

完整代碼

MainActivity.java

package com.example.dynamicauthority;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_CODE = 999;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermission();
    }
    private void requestPermission() {
        // checkSelfPermission() 檢測(cè)權(quán)限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
            //TODO 申請(qǐng)存儲(chǔ)權(quán)限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    PERMISSION_REQUEST_CODE);
        }
    }
    //TODO 處理權(quán)限結(jié)果回調(diào)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            //用戶點(diǎn)擊了“確定” == grantResults[0] == PackageManager.PERMISSION_GRANTED)
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i("TAG", "onRequestPermissionsResult granted");
            } else {
                Log.i("TAG", "onRequestPermissionsResult denied");
                // TODO 用戶拒絕權(quán)限申請(qǐng),則彈出警示框
                showWaringDialog();
            }
        }
    }
    /**
     * 用戶拒絕權(quán)限的警示
     */
    private void showWaringDialog() {
        new AlertDialog.Builder(this)
                .setTitle("警告!")
                .setMessage("請(qǐng)前往設(shè)置->應(yīng)用->權(quán)限管理->打開存儲(chǔ)權(quán)限,否則無法正常使用!")
                .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //TODO 一般情況下如果用戶不授權(quán)的話,功能時(shí)無法運(yùn)行的,則直接退出
                        finish();
                    }
                }).show();
    }
}

到此這篇關(guān)于Android動(dòng)態(tài)權(quán)限申請(qǐng)實(shí)現(xiàn)步驟分解的文章就介紹到這了,更多相關(guān)Android動(dòng)態(tài)權(quán)限申請(qǐng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論