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

相关推荐
每次的天空11 分钟前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭39 分钟前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日2 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安2 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑2 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟6 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡7 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi007 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil9 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你9 小时前
Android View的绘制原理详解
android