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

news/2024/11/20 6:25:30/

1,android权限机制

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

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

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

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

<?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()方法。以下是一个示例代码,展示了如何在运行时请求危险权限

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


http://www.ppmy.cn/news/1260356.html

相关文章

【Java面试——JVM和调优】

JVM虚拟机和调优相关。 5.1 类加载机制 类加载的生命周期&#xff1f; 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中&#xff0c;加载、验证、准备和初始化这四个阶段发生的顺序是确定的&#xff0c;而解析阶段则不一定&#xff0c;它在某些…

【滤波第三期】卡尔曼滤波的原理和C代码

卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种递归的、自适应的滤波算法&#xff0c;广泛应用于估计系统状态和观测过程中的噪声。它最初在1960年被提出&#xff0c;被认为是控制理论和信号处理领域中最重要的发展之一。卡尔曼滤波器在许多领域&#xff0c;包括导航、…

【数据结构】——二叉树简答题模板

目录 一、树和二叉树的概念&#xff08;一&#xff09;二叉树的定义和性质&#xff08;二&#xff09;树和二叉树的区别 二、完全二叉树和满二叉树三、二叉树的遍历&#xff08;一&#xff09;由序列确定二叉树&#xff08;二&#xff09;不同遍历序列的关系 四、二叉树的性质&…

html css样式选择器介绍

目录 一、单标签选择器二、多标签选择器三、类选择器四、标签结合类选择器五、多个标签结合类选择器六、子标签选择器七、所有子标签选择器八、相邻选择器九、多种选择器混合使用十、超链接样式选择器 一、单标签选择器 下面的 css 会将所有 h1 标签里的文字设置为红色 <!…

天池SQL训练营(三)-复杂查询方法-视图、子查询、函数等

-天池龙珠计划SQL训练营 SQL训练营页面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 3.1 视图 我们先来看一个查询语句&#xff08;仅做示例&#xff0c;未提供相关数据&#xff09; SELECT stu_name FROM view_students_info;单从表面上看起来…

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3&#xff0c;包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识&#xff0c;为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

从零构建属于自己的GPT系列3:模型训练2(训练函数解读、模型训练函数解读、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

《C++ primer》 anki学习卡片txt输出101张,更新至第2章,截止2023年12月6日

C程序中{{c1::}}要有main函数 一定 不一定 一个函数定义包含哪几个部分 返回类型 函数名&#xff08;形参列表&#xff09; { 函数体 } main函数返回值为0时&#xff0c;表示{{c1::}} 成功 失败 无论你使用命令行页面或者IDE&#xff0c;大多数编译器都要求程序源码存储在一…