【android开发-18】android中运行时申请权限详解

1,android权限机制

在Android中,权限机制是一种保护用户隐私和数据安全的重要机制。它允许应用程序在访问敏感或危险的数据或资源时获取特定的权限。以下是Android中权限机制的详细解释:

1,权限类别:Android将权限分为两种类别:正常权限和危险权限。正常权限是对应用程序运行所需的基本功能或数据的访问,例如读取外部存储或访问网络。这些权限通常在应用程序的manifest文件中声明,并在安装时由用户授予。危险权限涉及对用户隐私或系统资源的潜在风险,例如读取联系人或访问摄像头。这些权限通常需要用户显式授予,并可能需要在运行时请求。

2,权限声明:应用程序在它的manifest文件中声明所需权限。这些声明包括权限的名称和保护级别。保护级别表示权限的敏感性和危险性。例如,保护级别为"普通"的权限可以在安装时自动授予,而保护级别为"危险"的权限需要用户显式授予。

在Android中,权限声明通常在应用程序的AndroidManifest.xml文件中进行。以下是一个示例,展示了如何在AndroidManifest.xml文件中声明所需的权限:

cpp 复制代码
<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.example.myapp">  
  
    <!-- 声明所需的权限 -->  
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <uses-permission android:name="android.permission.CAMERA" />  
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
  
    <!-- 其他声明 -->  
    <application  
        android:allowBackup="true"  
        android:icon="@mipmap/ic_launcher"  
        android:label="@string/app_name"  
        android:roundIcon="@mipmap/ic_launcher_round"  
        android:supportsRtl="true"  
        android:theme="@style/AppTheme">  
        <!-- 其他代码 -->  
    </application>  
  
</manifest>

在上述示例中,我们声明了四个权限:READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE、CAMERA和ACCESS_FINE_LOCATION。每个权限都由元素表示。在实际应用中,你可能需要根据自己的需求来声明相应的权限。请注意,只有正常权限可以在应用程序的manifest文件中声明并在安装时自动授予。危险权限需要在运行时请求

3,权限请求和授权:应用程序可以在运行时请求危险权限。为了请求权限,应用程序需要使用Android的Permission API来请求特定的权限。当应用程序请求危险权限时,系统会显示一个对话框,提示用户授予权限。如果用户授予权限,应用程序将能够继续执行需要该权限的操作。如果用户拒绝权限,应用程序将无法执行这些操作。

下表中列出了android中所有的危险权限,一共9组24个权限:

如果属于这张表中的权限,那么就需要运行时权限处理,如果不在这张表中,那么只需要在androidmenifest.xml中添加一下权限声明就可以了。

4,权限管理和撤销:Android系统提供了权限管理功能,允许用户查看和管理应用程序的权限。用户可以在设置应用程序的权限设置中查看和更改应用程序的权限。此外,应用程序也可以在自己的代码中使用Permission API来检查和管理它自己的权限状态。

5,权限升级和降级:如果应用程序需要访问更敏感或危险的数据或资源,它可能需要升级到更高的权限级别。同样地,如果应用程序不再需要访问某些数据或资源,它可能需要降级到更低的权限级别。这些升级和降级可以在应用程序的manifest文件中声明,并在安装时由系统处理。

总之,Android的权限机制允许应用程序在访问敏感或危险的数据或资源时获取特定的权限,同时保护用户的隐私和数据安全。应用程序需要在manifest文件中声明所需的权限,并在运行时请求危险权限。用户可以管理和更改应用程序的权限,以确保其隐私和安全需求得到满足。

2,程序运行时申请权限

在Android中,如果需要在运行时请求权限,可以使用ActivityCompat.requestPermissions()方法。以下是一个示例代码,展示了如何在运行时请求危险权限

cpp 复制代码
import androidx.core.content.ContextCompat;  
import androidx.core.app.ActivityCompat;  
import android.Manifest;  
import android.content.pm.PackageManager;  
import android.os.Bundle;  
import android.support.v4.app.ActivityCompat.PermissionResult;  
import android.support.v7.app.AppCompatActivity;  
  
public class MainActivity extends AppCompatActivity {  
  
    private static final int REQUEST_CODE_PERMISSION = 1001;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        // 检查所需权限是否已授权  
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {  
            // 权限未授权,请求权限  
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_PERMISSION);  
        } else {  
            // 权限已授权,执行相应操作  
            // ...  
        }  
    }  
  
    @Override  
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {  
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
        if (requestCode == REQUEST_CODE_PERMISSION) {  
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {  
                // 权限被授予,执行相应操作  
                // ...  
            } else {  
                // 权限被拒绝,根据需求处理  
                // ...  
            }  
        }  
    }  
}

在上述示例中,我们首先检查应用程序是否已获得CAMERA权限。如果未获得权限,我们调用ActivityCompat.requestPermissions()方法来请求该权限。该方法接受三个参数:当前活动、所需的权限数组和一个请求代码。在onRequestPermissionsResult()方法中,我们检查是否为所需的权限请求,并根据授予结果执行相应的操作。

注意:调用完了requestPermissions方法之后,系统会弹出一个权限申请的对话框,然后用户选择同意或者拒绝,不论哪种结果,最终都会回调onRequestPermissionsResult方法,而授权的结果封装在grantResults参数中。

相关推荐
手机不死我是天子2 小时前
《Android 核心组件深度系列 · 第 2 篇 Service》
android
前行的小黑炭3 小时前
Compose页面切换的几种方式:Navigation、NavigationBar+HorizontalPager,会导致LaunchedEffect执行?
android·kotlin·app
前行的小黑炭3 小时前
Android :Comnpose各种副作用的使用
android·kotlin·app
BD_Marathon17 小时前
【MySQL】函数
android·数据库·mysql
西西学代码17 小时前
安卓开发---耳机的按键设置的UI实例
android·ui
maki07721 小时前
虚幻版Pico大空间VR入门教程 05 —— 原点坐标和项目优化技巧整理
android·游戏引擎·vr·虚幻·pico·htc vive·大空间
千里马学框架1 天前
音频焦点学习之AudioFocusRequest.Builder类剖析
android·面试·智能手机·车载系统·音视频·安卓framework开发·audio
fundroid1 天前
掌握 Compose 性能优化三步法
android·android jetpack
TeleostNaCl1 天前
如何在 IDEA 中使用 Proguard 自动混淆 Gradle 编译的Java 项目
android·java·经验分享·kotlin·gradle·intellij-idea
旷野说1 天前
Android Studio Narwhal 3 特性
android·ide·android studio