【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参数中。

相关推荐
檀越剑指大厂3 小时前
容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
android
MiyamuraMiyako4 小时前
从 0 到发布:Gradle 插件双平台(MavenCentral + Plugin Portal)发布记录与避坑
android
NRatel4 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
叽哥7 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走7 小时前
创建自定义语音录制View
android·前端
用户2018792831677 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831677 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker9 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong9 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil10 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin