Android - 请求应用权限

准备

IDE:

Android Studio 4.1.1
Build #AI-201.8743.12.41.6953283, built on November 5, 2020
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

Android Virtual Device:

Name: Pixel_2_API_28
CPU/ABI: Google Play Intel Atom (x86)
Path: C:\Users\86188\.android\avd\Pixel_2_API_28.avd
Target: google_apis_playstore [Google Play] (API level 28)
Skin: pixel_2
SD Card: 512M
fastboot.chosenSnapshotFile: 
runtime.network.speed: full
hw.accelerometer: yes
hw.device.name: pixel_2
hw.lcd.width: 1080
hw.initialOrientation: Portrait
image.androidVersion.api: 28
tag.id: google_apis_playstore
hw.mainKeys: no
hw.camera.front: emulated
avd.ini.displayname: Pixel 2 API 28
hw.gpu.mode: auto
hw.ramSize: 1536
PlayStore.enabled: true
fastboot.forceColdBoot: no
hw.cpu.ncore: 4
hw.keyboard: yes
hw.sensors.proximity: yes
hw.dPad: no
hw.lcd.height: 1920
vm.heapSize: 256
skin.dynamic: yes
hw.device.manufacturer: Google
hw.gps: yes
hw.audioInput: yes
image.sysdir.1: system-images\android-28\google_apis_playstore\x86\
showDeviceFrame: yes
hw.camera.back: virtualscene
AvdId: Pixel_2_API_28
hw.lcd.density: 420
hw.arc: false
hw.device.hash2: MD5:55acbc835978f326788ed66a5cd4c9a7
fastboot.forceChosenSnapshotBoot: no
fastboot.forceFastBoot: yes
hw.trackBall: no
hw.battery: yes
hw.sdCard: yes
tag.display: Google Play
runtime.network.latency: none
disk.dataPartition.size: 6442450944
hw.sensors.orientation: yes
avd.ini.encoding: UTF-8
hw.gpu.enabled: yes

注意:以下示例仅在安卓虚拟设备上运行测试,并没有在真实的设备上运行测试。

请求应用权限

新建项目,选择 Empty Activity,在配置项目时,我选择的 Minimum SDKAPI 23: Android 6.0 (Marshmallow)

build.gradle 文件(默认):

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.mk"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

编辑 src\main\AndroidManifest.xml 应用清单,列出应用需要的权限(第 3 ~ 4 行):

<manifest ...>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    ...
</manifest>

编辑 src\main\res\layout\activity_main.xml 布局文件,删除原有的 TextView 元素,新增 Button 元素(第 9 ~ 19):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:text="Request App Permissions"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity 文件:

package com.mk;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity {
    
    

    private static final int REQUEST_CODE_PERMISSIONS = 1;

    private Context context;
    private Activity activity;

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

        context = getApplicationContext();
        activity = this;

        String[] permissions = new String[] {
    
     Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE }; // 应用需要的权限

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                for (String permission : permissions) {
    
    
                    if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED) {
    
    
                        ActivityCompat.requestPermissions(activity, permissions, REQUEST_CODE_PERMISSIONS); // 请求权限
//                    requestPermissions(permissions, REQUEST_CODE_PERMISSIONS); // Call requires API level 23
                        break;
                    }
                }
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
//        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        Log.d("MainActivity", "onRequestPermissionsResult: " + Arrays.toString(permissions));
        Log.d("MainActivity", "onRequestPermissionsResult: " + Arrays.toString(grantResults));

        if (requestCode == REQUEST_CODE_PERMISSIONS) {
    
    
            for (int i = 0; i < permissions.length; i++) {
    
    
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
    
     // 用户授予的权限
                    switch (permissions[i]) {
    
    
                        case Manifest.permission.RECORD_AUDIO:
                            Log.d("MainActivity", "onRequestPermissionsResult: " + Manifest.permission.RECORD_AUDIO + " is granted");
                            break;
                        case Manifest.permission.WRITE_EXTERNAL_STORAGE:
                            Log.d("MainActivity", "onRequestPermissionsResult: " + Manifest.permission.WRITE_EXTERNAL_STORAGE + " is granted");
                            break;
                    }
                } else {
    
     // 用户拒绝的权限
                    switch (permissions[i]) {
    
    
                        case Manifest.permission.RECORD_AUDIO:
                            Log.d("MainActivity", "onRequestPermissionsResult: " + Manifest.permission.RECORD_AUDIO + " is denied");
                            break;
                        case Manifest.permission.WRITE_EXTERNAL_STORAGE:
                            Log.d("MainActivity", "onRequestPermissionsResult: " + Manifest.permission.WRITE_EXTERNAL_STORAGE + " is denied");
                            break;
                    }
                }
            }
        }
    }
}

运行效果,以及日志输出:

在这里插入图片描述

参考

Request app permissions

猜你喜欢

转载自blog.csdn.net/qq_29761395/article/details/113784655