Android11及以上文件读写权限申请详细介绍

针对“Android11及以上文件读写权限申请详细介绍”的完整攻略,我将会从以下几个方面进行介绍:

  1. Android 11及以上文件读写权限简介
  2. 权限申请流程
  3. 示例说明
  4. 总结

1. Android 11及以上文件读写权限简介

从 Android 11 开始,应用程序需要获得存储权限才能访问外部存储设备上的文件。存储空间的使用分为两种类型:应用内部存储和外部存储。应用内部存储包含应用的私有文件目录,而外部存储包含用户可以在应用之间共享的文件目录。

在 Android 11 之前,应用可以使用以下任何机制来访问存储,不需要授予存储权限:

  • 应用内部存储
  • MediaStore API
  • 外部存储的传统API

但是在 Android 11 及以上版本中,应用程序必须先向用户申请访问外部存储设备的权限,而且规则有所改变。如果应用未获得必要的权限,则将视为未经授权地访问存储空间,并且可能会导致应用在设备上的限制。

2. 权限申请流程

下面是针对 Android 11及以上版本文件读写权限的申请流程:

  1. 在应用清单中声明需要权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. 对于 Android 11 及以上的设备,您还需要在应用清单文件中添加以下代码:
<application
  android:requestLegacyExternalStorage="true">
</application>
  1. 检查权限是否已经获得,如下所示:
if (ContextCompat.checkSelfPermission(
    context, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
    PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted, request it
    ActivityCompat.requestPermissions(MainActivity.this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
}
  1. 处理权限请求结果:
@Override
public void onRequestPermissionsResult(int requestCode,
        @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE) {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0 &&
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission has been granted, write your code
        } else {
            // Permission denied, handle it
        }
    }
}

3. 示例说明

示例1:使用 DocumentFile 来访问外部存储

只有在用户授予了外部存储访问权限时,才能使用 DocumentFile API。

可以使用以下代码在Android 11及以上设备上的共享目录中创建文件夹:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
  ContentValues values = new ContentValues();
  values.put(MediaStore.MediaColumns.DISPLAY_NAME, "My folder");
  values.put(MediaStore.MediaColumns.MIME_TYPE, DocumentsContract.Document.MIME_TYPE_DIR);
  Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  if (uri != null) {
      DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri);
      documentFile.createDirectory("My subfolder");
  }
}

示例2:使用 SAF 选择导出文件

即使用户未授权您的应用程序访问外部存储,您的应用程序也可以使用以下示例代码选择导出的文件。

final Intent exportIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(exportIntent, REQUEST_CODE_OPEN_DOCUMENT_TREE);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE_OPEN_DOCUMENT_TREE && resultCode == RESULT_OK) {
        Uri treeUri = data.getData();
        DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
        exportFile(pickedDir);
    }
}

private void exportFile(DocumentFile pickedDir) {
    // Your export code here
}

4. 总结

以上是 Android 11及以上文件读写权限的申请流程和两个示例。在开发需要访问外部存储的应用时,请务必考虑到这些更改,以便提供更好的用户体验。

阅读剩余 58%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android11及以上文件读写权限申请详细介绍 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • pythonitchat模块的使用 利用图灵机器人进行微信消息自动…

    Python itchat模块的使用:利用图灵机器人进行微信消息自动回复 介绍 itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。 本篇文章将会介绍如何使用itchat模块和图灵机器人API进行微信消息的自动回复。 准备工作 首先,我们需要安装itchat模块和requests模块。 安装itchat模块:pip install …

    其他 2023年3月28日
    00
  • linux下rsync命令详细整理

    Linux下rsync命令详细整理 什么是rsync rsync是一款在Linux系统中广泛使用的数据同步工具。它可以通过网络将本地文件或者远程文件同步到远程服务器上,还可以在本地机器之间进行同步。rsync最大的特点是它可以实现增量同步,即只传输文件的差异部分,大大节约了带宽和时间。 安装rsync 在大部分的Linux发行版中,rsync都已经预安装了。…

    other 2023年6月28日
    00
  • javascript学习笔记(五)原型和原型链详解

    下面是关于 “javascript学习笔记(五)原型和原型链详解” 的完整攻略: 1. 什么是原型 在 JavaScript 中,每一个对象都有一个原型对象(即 proto)属性,如果访问一个对象的属性时,该对象本身没有该属性,那么就会沿着原型链,去其原型对象中查找该属性,如果还没找到,就会一直向上查找,直至查找到 Object.prototype,这就是原…

    other 2023年6月26日
    00
  • vue封装axios与api接口管理的完整步骤

    下面我将详细讲解vue封装axios与api接口管理的完整步骤。 1. 安装axios 在开始封装axios之前,我们需要先安装axios。可以通过npm进行安装: npm install axios –save 2. 封装axios 封装axios的目的是为了在项目中统一处理请求和响应,方便管理和维护。以下是封装axios的完整步骤: 2.1 创建axi…

    other 2023年6月25日
    00
  • AirPodsPro怎么查看充电盒版本? airpods pro充电盒版本号的看法

    要查看AirPods Pro的充电盒版本号,您可以按照以下步骤进行操作: 确保您的AirPods Pro已经连接到您的设备上,并且充电盒已经打开。 打开您的设备的设置菜单,例如iPhone或iPad。 在设置菜单中,找到并点击“蓝牙”选项。 在蓝牙设置页面中,您应该能够看到已连接的AirPods Pro设备。点击旁边的“i”图标,以进入更多设置选项。 在Ai…

    other 2023年8月3日
    00
  • JAVA实现SOCKET多客户端通信的案例

    首先,我们需要明确一下什么是Socket,Socket是一种抽象的概念,是对地址和端口的封装。在计算机网络中,Socket指的就是TCP/IP协议网络编程接口,它是应用层与传输层之间的连接门户,使得网络应用程序能够访问传输层协议,进行数据传输。本文将详细讲解如何用Java实现Socket多客户端通信的案例。 1. 服务器端的实现 1.1 创建ServerSo…

    other 2023年6月25日
    00
  • Android Navigation重建Fragment问题分析及解决

    我来详细讲解一下“Android Navigation重建Fragment问题分析及解决”的完整攻略。 什么是Navigation重建Fragment问题? 在使用Android Navigation组件时,如果使用了NavigationUI.setupWithNavController()来设置BottomNavigationView或者使用了AppBar…

    other 2023年6月27日
    00
  • 微信小程序 教程之引用

    微信小程序教程之引用攻略 1. 引用的概念 在微信小程序中,引用是指在一个小程序中使用另一个小程序的功能或页面。通过引用,我们可以实现代码的复用,提高开发效率。 2. 引用的使用方法 2.1 引用小程序的页面 要引用另一个小程序的页面,需要在当前小程序的app.json文件中配置引用的小程序的usingComponents字段。示例如下: { \"…

    other 2023年8月20日
    00
合作推广
合作推广
分享本页
返回顶部