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

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

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

相关文章

  • Kotlin语言使用WebView示例介绍

    Kotlin语言使用WebView示例介绍 简介 WebView是Android平台上的一个重要组件,它可以在应用程序中显示网页内容。Kotlin语言提供了简洁而强大的方式来使用WebView组件。本攻略将详细介绍如何在Kotlin语言中使用WebView,并提供两个示例说明。 示例一:加载网页 以下是一个简单的示例,演示了如何在Kotlin中使用WebVi…

    other 2023年9月6日
    00
  • C++探索构造函数私有化会产生什么结果

    C++中的构造函数是实例化一个类时被调用的函数。如果将构造函数私有化,那么实例化一个类的过程将无法调用该构造函数,从而导致编译错误,因为无法实例化该类。 下面是两条示例说明: 示例一 首先,我们定义一个Student类,并将构造函数设置为私有: #include <iostream> using namespace std; class Stud…

    other 2023年6月26日
    00
  • java获取两个日期之间的所有日期(年月日)

    当然,我很乐意为您提供有关“Java获取两个日期之间的所有日期(年月日)”的完整攻略。以下是详细的步骤和两个示例: 1 获取两个日期之间的所有日期 要获取两个日期之间的所有日期,可以使用Java中的Calendar类和SimpleDateFormat类。以下是获取两个日期之间的所有日期的步骤: 创建两个日期对象,表示要获取的日期范围。 使用Calendar类…

    other 2023年5月6日
    00
  • SpringBoot2.3集成ELK7.1.0的示例代码

    以下是Spring Boot 2.3集成ELK 7.1.0的示例代码的完整攻略: 步骤1:安装和配置ELK Stack 首先,安装Elasticsearch、Logstash和Kibana。您可以从官方网站下载并按照它们的安装指南进行安装。 配置Elasticsearch: 打开elasticsearch.yml配置文件。 设置cluster.name为您的…

    other 2023年10月17日
    00
  • python中的tcp示例详解

    Python中的TCP示例详解 在Python中,使用TCP/IP协议进行网络通信非常常见。本篇文章将结合两个简单的例子,详细讲解Python中如何使用TCP协议进行通信。 示例一:客户端与服务端的基本交互 首先,我们需要了解socket模块。在Python中,socket模块提供了构建网络应用程序所需的基础设施。具体可以通过以下代码引入socket模块: …

    other 2023年6月27日
    00
  • php自动加载规范psr4(thinkphp)

    PHP 自动加载规范 PSR-4(ThinkPHP) 什么是自动加载 在 PHP 开发中,需要引入不同的类和库文件,传统的方式是使用 include 或者 require 函数来加载。这种方式虽然简单易用,但是在项目代码量庞大时,频繁使用 include 或者 require 函数会导致程序运行效率低下,甚至会影响网站访问速度。 PHP 自动加载是一种常见的…

    其他 2023年3月29日
    00
  • vue日程/日历管理插件fullcalendar(模仿wps日程)

    Vue日程/日历管理插件FullCalendar攻略 FullCalendar是一个基于jQuery和Moment.js的开源日历插件,用于在Web应用中显示日程和事件。FullCalendar还提供了许多可定制的选项,使您可以轻松地自定义日历的外观和行为。在本攻略中,我们将详细讲解如何在Vue应用程序中使用FullCalendar插件。 FullCalen…

    other 2023年5月9日
    00
  • 如何避免企业网络安全设备部署失败的解决方案

    如何避免企业网络安全设备部署失败的解决方案 1. 确定安全设备部署前的要求 在企业网络安全设备部署前,应当明确以下要求: 确认企业网络的拓扑结构,确定安全设备需要部署在哪些位置 建立完善的网络规划和设计,确保安全设备能够正常工作 确认安全设备的配置和升级方案,避免出现设备配置不当或不兼容的问题 确认安全设备的管理流程和人员角色,确保设备的正常运维和管理 通过…

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