Android 运行时权限

androidmobile developmentapps/applications更新于 2026/1/31 10:52:17

简介

如今,在许多 Android 应用中,我们经常会看到应用在运行时请求使用特定功能的权限。例如,使用设备摄像头的应用会在运行时请求摄像头权限,用户可以授予或拒绝该权限。本文将介绍如何在 Android 应用中添加运行时权限。

实现

我们将创建一个简单的应用,其中我们将创建一个文本视图来显示应用的标题。之后,我们将创建一个按钮用于请求权限。在这个应用中,我们将请求在 Android 设备中读取短信的权限。

步骤 1:在 Android Studio 中创建新项目

按照下图所示导航到 Android Studio。在下面的屏幕中,点击"新建项目"以创建一个新的 Android Studio 项目。

点击"新建项目"后,您将看到以下屏幕。

在此屏幕中,我们只需选择"空活动"并点击"下一步"。点击"下一步"后,您将看到以下屏幕。

在此屏幕中,我们只需指定项目名称。然后,软件包名称将自动生成。

注意:请确保选择 Java 作为语言。

指定所有详细信息后,点击"完成"以创建一个新的 Android Studio 项目。

项目创建完成后,我们将看到两个打开的文件,即 activity_main.xml 和 MainActivity.java 文件。

步骤 2:使用 activity_main.xml

导航到 activity_main.xml。如果此文件不可见,请打开此文件。在左侧窗格中,导航至 app>res>layout>activity_main.xml 以打开此文件。打开此文件后,将以下代码添加到其中。代码中添加了注释,以便您详细了解。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

   <!-- creating a text view on below line-->
   <TextView
       android:id="@+id/idTVMessage"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_above="@id/idBtnRequestPermissions"
       android:layout_margin="20dp"
       android:padding="4dp"
       android:text="Android Runtime Permissions"
       android:textAlignment="center"
       android:textColor="@color/black"
       android:textSize="23sp"
       android:textStyle="bold" />
   <!-- creating a button for displaying a short message -->
   <Button
       android:id="@+id/idBtnRequestPermissions"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:layout_marginStart="10dp"
       android:layout_marginTop="10dp"
       android:layout_marginEnd="10dp"
       android:layout_marginBottom="10dp"
       android:text="Request SMS Permissions"
       android:textAllCaps="false" />
</RelativeLayout>

说明:在上面的代码中,我们创建了一个相对布局的根布局。在这个布局中,我们创建了一个文本视图,用于显示应用程序的标题。之后,我们创建一个按钮,用于请求在移动设备上读取短信的权限。

步骤 3:在 AndroidManifest.xml 文件中添加权限

导航至 app>AndroidManifest.xml 文件,并在 manifest 标签中添加以下权限以读取短信。

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

步骤 4:使用 MainActivity.java 文件

导航至 MainActivity.java。如果此文件不可见,请打开此文件。在左侧窗格中,导航至 app>res>layout>MainActivity.java 并打开此文件。打开此文件后,添加以下代码。代码中添加了注释,以便您详细了解。

package com.example.java_test_application;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {
   // creating variables on below line for button.
   private Button permissionsBtn;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       // initializing variables on below line.
       permissionsBtn = findViewById(R.id.idBtnRequestPermissions);
       // on below line adding click listener for short message button.
       permissionsBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               // on below line we are checking the self permissions for reading sms.
               if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_DENIED) {
                   // if permission is not granted then we are requesting for the permissions on below line.
                   ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, 100);
               } else {
                   // if permission is already granted then we are displaying a toast message as permission granted.
                   Toast.makeText(MainActivity.this, "Permission already granted", Toast.LENGTH_SHORT).show();
               }
           }
       });
   }

   @Override
   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       // on below line we are checking for the request code.
       if (requestCode == 100) {
           // on below line we are checking if permissions are granted.
           if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               // displaying a toast message when permission is granted.
               Toast.makeText(MainActivity.this, "Read SMS Permission Granted", Toast.LENGTH_SHORT).show();
           } else {
               // displaying a toast message when permission is denied.
               Toast.makeText(MainActivity.this, "Read SMS Permission Denied", Toast.LENGTH_SHORT).show();
           }
       }
   }
}

说明:在上面的代码中,我们首先为按钮创建变量。现在我们来看一下 onCreate 方法。这是每个 Android 应用程序的默认方法。此方法在应用程序视图创建时调用。在该方法中,我们设置内容视图,即名为 activity_main.xml 的布局文件,并从该文件设置 UI。在 onCreate 方法中,我们使用在 activity_main.xml 文件中指定的 ID 初始化按钮变量。之后,我们为两个按钮添加了点击监听器。在点击监听器中,我们首先检查权限是否已被授予。如果已授予权限,则会显示一条提示消息表示权限已授予。如果未授予权限,则请求读取短信的权限。现在,我们再创建一个 onPermissionResult 方法,用于检查用户是否已授予或拒绝权限。

添加上述代码后,只需点击顶部栏中的绿色图标即可在移动设备上运行我们的应用程序。

注意 - 请确保已连接到真实设备或模拟器。

输出


结论

在上文中,我们介绍了如何在 Android 应用中添加运行时权限。


相关文章