首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 11作用域存储权限

Android 11作用域存储权限

基础概念

Android 11引入了作用域存储(Scoped Storage)权限模型,旨在更好地管理应用程序对文件的访问权限,提高用户数据的隐私性和安全性。作用域存储通过限制应用程序对存储的访问范围,使得每个应用程序只能访问其自己的文件,除非明确获得用户的授权。

相关优势

  1. 增强隐私保护:应用程序无法随意访问其他应用程序的文件,减少了数据泄露的风险。
  2. 简化文件管理:应用程序可以更方便地管理其自己的文件,无需处理复杂的文件系统权限。
  3. 提高系统性能:通过限制不必要的文件访问,减少了系统资源的消耗。

类型

Android 11的作用域存储权限主要包括以下几种类型:

  1. MediaStore API:用于访问共享媒体文件,如图片、视频和音频文件。
  2. Storage Access Framework (SAF):允许用户选择文件或目录,并授予应用程序访问权限。
  3. App-specific directories:应用程序可以访问其自己的私有目录,如getExternalFilesDir()getExternalCacheDir()

应用场景

  1. 图片和视频处理:应用程序可以请求访问用户选择的图片或视频文件,进行编辑或分享。
  2. 文件下载和管理:应用程序可以下载文件并存储在其私有目录中,确保其他应用程序无法访问。
  3. 备份和恢复:应用程序可以访问其自己的文件进行备份和恢复操作。

常见问题及解决方法

问题1:如何请求作用域存储权限?

在Android 11中,应用程序需要显式请求作用域存储权限。可以通过以下步骤实现:

  1. AndroidManifest.xml中声明所需的权限:
  2. AndroidManifest.xml中声明所需的权限:
  3. 在代码中请求权限:
  4. 在代码中请求权限:

问题2:如何访问共享媒体文件?

可以使用MediaStore API访问共享媒体文件。以下是一个示例代码:

代码语言:txt
复制
Uri collection;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else {
    collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().appendQueryParameter("images", "true").build();
}

Cursor cursor = getContentResolver().query(collection, null, null, null, null);
if (cursor != null) {
    while (cursor.moveToNext()) {
        String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
        Uri uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
        // 处理文件
    }
    cursor.close();
}

问题3:如何使用Storage Access Framework?

可以使用Storage Access Framework让用户选择文件或目录,并授予应用程序访问权限。以下是一个示例代码:

代码语言:txt
复制
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);

onActivityResult中处理返回的结果:

代码语言:txt
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        if (resultData != null) {
            Uri uri = resultData.getData();
            // 处理文件
        }
    }
}

参考链接

通过以上内容,您可以更好地理解Android 11作用域存储权限的基础概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android | 作用域存储适配

前言 Android 10 已经发布了很长一段时间了,并且 Android 11 已经有很大一部分人在使用了,那么你的程序对他做了适配吗?...在 10.0 中,作用域存储变得非常重要,这个新的功能颠覆了我们一直惯用外置存储的方式,因此大量的 app 都面临着代码的适配 本篇文章对作用域存储,以及如何进行适配,做了比较详细的介绍 在 7.0...作用域存储 ​ 10.0 中,为了解决上述问题, google 在 Android 10 中加入了作用域功能 ​ 什么是作用域呢?...就是 Android 系统对 SD 卡做了很大的限制,从 10.0 开始,每个程序只能有权在自己的外置存储空间关联的目录下读取和创建相应的文件,也称作沙箱。...权限,WRITE_EXTERNAL_STORAGE 权限会在未来的版本中被废弃。

79220

Android 10适配要点,作用域存储

本篇文章对作用域存储进行了比较全面的解析,相信看完之后你将能够轻松地完成Android 10作用域存储的适配升级。...理解作用域存储 Android长久以来都支持外置存储空间这个功能,也就是我们常说的SD卡存储。...那么到底什么是作用域存储呢?简单来讲,就是Android系统对SD卡的使用做了很大的限制。...而在作用域存储这个功能上面,恭喜大家,暂时确实是可以不用升级的。 目前Android 10系统对于作用域存储适配的要求还不是那么严格,毕竟之前传统外置存储空间的用法实在是太广泛了。...第三方SDK不支持作用域存储怎么办? 阅读完了本篇文章之后,相信你对Android 10作用域存储的用法和适配基本上都已经掌握了。

2.2K10
  • 在 Android 和 Hilt 中限定作用域

    在 Android 中,您不使用 DI 库也可以通过 Android Framework 来手动限定作用域。让我们看看如何手动限定作用域,以及如何改用 Hilt 来限定作用域。...最后,我们将比较使用 Android Framework 手动限定作用域和使用 Hilt 限定作用域的区别。...在 Android 中限定作用域 看了上文的定义,您可能会有这样的异议: 在某个特定类中使用一个类型的实例变量也可以做到限定该变量类型的作用域。没错!...因为 Activity 具有 ViewModel 的访问权限,所以在该 Activity 中可以始终获得相同的 AnalyticsAdapter 实例。...当然,当您需要限定作用域时,您可以使用 Hilt 中的作用域注解,也可以直接使用 Android Framework。

    1.4K20

    Android 11 中的存储机制更新

    Android 10 引入了对外部存储权限的更改,旨在更好地保护用户数据以及降低应用的存储空间。Android 11 开发者预览版里加入了更多改进,以帮助开发者更好地适应这些权限修改。...在 Android 10 中,我们调整了存储权限的工作方式,仅为应用提供其所需的访问权限。这也是在鼓励应用在指定目录下进行文件存储以限制文件混乱。当应用被卸载后,这些相关的目录也会被删除。...在 Android 11 中,我们会通过下述的几点来继续优化分区存储 (Scoped Storage) 的开发者体验。...Android 10 对外部存储权限行为 developer.android.google.cn/training/da… 改进媒体存储 Android 10 中要求所有应用都使用 MediaStore...Android 11 里将会引入一个特别的权限叫做 MANAGE_EXTERNAL_STORAGE,该权限将授权读写所有共享存储内容,这也将同时包含非媒体类型的文件。

    3.1K11

    Android 10(Q)11(R) 分区存储适配

    为此,Google 终于下定决心在 Android 10 中引入了分区存储,对权限进行场景的细分,按需索取,并在 Android 11 中进行了进一步的调整。...Android 存储分区情况 Android 中存储可以分为两大类:私有存储和共享存储 私有存储 (Private Storage) : 每个应用在都拥有自己的私有目录,其它应用看不到,彼此也无法访问到该目录...Android 11 (R) Android 11 (R) 在 Android 10 (Q) 中分区存储的基础上进行了调整。 1....新增执行批量操作 为实现各种设备之间的一致性并增加用户便利性,Android 11 向 MediaStore API 中添加了多种方法。...使用直接文件路径和原生库访问文件 为了帮助您的应用更顺畅地使用第三方媒体库,Android 11 允许您使用除 MediaStore API 之外的 API 访问共享存储空间中的媒体文件。

    2.4K30

    C语言变量的存储方式、作用域和生命周期

    一、作用域 1、作用域问题:在一个函数中定义的变量,在其他函数中能否被引用?在不同位置定义的变量,在什么范围内有效?...C的存储类别有4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。变量的存储类别对应变量的作用域与生命周期。...(1)在一个文件内扩展外部变量的作用域,应在引用前用关键字extern对该变量作“外部变量声明”,表示把该外部变量的作用域扩展到此位置。...注:extern即可以用来扩展外部变量在本文件中的作用域,又可以使外部变量的作用域从一个文件扩展到程序中的其他文件。...如果找到就将作用域扩展到本文件;如果没有就报错。

    93730

    C++随记(八)---存储持续性、作用域和链接性

    C++随记(八)---存储持续性、作用域和链接性 一、存储持续性 C++中一般使用3种(C++11中是四种,但是书上貌似没给第四种)不同的方案存储数据,这些方案的区别在于数据保留在内存中的时间。...这种内存的存储持续性为动态,有时候被称为自由存储或者堆。 二、作用域 作用域描述了名称在文件(翻译单元)的多大范围内可见。 作用域有多种: 作用域为局部的变量只在定义它的代码块中可用。...作用域为全局(也叫文件作用域)的变量在定义位置到文件结尾之间都可用。 还有函数原型作用域、名称空间作用域、函数作用域等等。 三、链接性 链接性描述了名称如何在不同单元间共享。...总结:不同的C++存储方式是通过存储持续性、作用域、链接性来描述的。 ①自动存储持续性: 在默认情况下,函数中声明的函数参数和 变量 为 自动存储持续性, 作用域为局部,无链接性。...A、外部链接性 的静态持续变量 的使用 链接性为外部的变量简称为外部变量,它们的存储持续性为静态,作用域为整个文件。

    1.1K00

    Android经典面试题之Kotlin中常见作用域函数

    Kotlin 中提供了一些内置的作用域函数(Scope Functions),它们通过改变代码块的上下文对象,使代码更加简洁和易读。...主要的作用域函数有以下五个:let、run、with、apply 和 also。这些函数主要区别在于:传递给代码块的对象是作为参数还是接收者,以及它们的返回值是什么。...以下是对每个作用域函数的详细说明: 1. let 用法: let 函数常用于可以避免空指针异常(NullPointerException),即在对象为非空时执行特定代码块。...根据需求选择合适的作用域函数,可以让你的代码更简洁和直观。 END 点亮【赞和在看】,让钱和爱都流向你。 心里种花,人生才不会荒芜,如果你也想一起成长,请点个关注吧。

    9010

    还有Android 11权限变更讲解

    支持Android 11 目前Android 11的Beta版本已在上周四正式发布了,我这次也算是走在了时代的前沿,第一时间研究了Android 11中的各种新特性。...Android 11中还引入了权限过期的机制,本来用户授予了应用程序某个权限,该权限会一直有效,现在如果某应用程序很长时间没有启动,Android系统会自动收回用户授予的权限,下次启动需要重新请求授权。...另外,Android 11针对摄像机、麦克风、地理定位这3种权限提供了单次授权的选项。...这个规则其实PermissionX是可以不用考虑的,如果开发者在Android 11中同时申请前台和后台定位权限 ,那么就让系统直接抛出异常也是合理的,因为这种请求方式违反了Android 11的规则。...假如你同时请求了前台和后台定位权限,在Android 10系统中会将它们一起申请,在Android 11系统中会将它们分开申请,在Android 9或以下系统,则不会去申请后台定位权限,因为那个时候还没有这个权限

    1.6K30

    【Android 文件管理】应用可访问的存储空间 ( 存储空间分类 | 存储空间访问权限 | 分区存储 )

    文章目录 一、存储空间分类 二、存储空间访问权限 三、分区存储 四、相关文档资料 一、存储空间分类 ---- 在 Android 9( API 级别 28 ) 及以下版本中 , Android 文件存储空间分为两类..., 内部存储空间 外部存储空间 内部存储空间的可靠性高于外部存储空间 ; 在 Android 10( API 级别 29 ) 及以上版本中 , 应用只能访问应用的 专属存储空间 和 共享存储 中的文件..., 包括媒体 , 文档 , 下载 等目录 ; 二、存储空间访问权限 ---- 内部存储空间访问不需要权限 ; 在 Android 9( API 级别28 ) 及以下版本中 访问外部存储需要使用 READ_EXTERNAL_STORAGE...和 WRITE_EXTERNAL_STORAGE 权限 ; 在 Android 10( API 级别 29 ) 及以上版本中 , 只能方位特定的目录 , 如应用专属目录 , 公共目录 , 不需要权限...---- Android 文件处理参考文档 : 数据和文件存储概览 访问应用专属文件 保存到共享的存储空间 管理存储设备上的所有文件 分享文件 应用安装位置 Android 存储用例和最佳做法 FileProvider

    2.5K30

    Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)

    Unity通过Android Studio 获取手机权限(存储、录音、相机等) 文章目录 Unity通过Android Studio 获取手机权限(存储、录音、相机等) 常用权限 一、动态获取权限流程...--外存储写权限,构建语法需要用到此权限 --> android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>...--外存储读权限,构建语法需要用到此权限 --> android:name="android.permission.READ_EXTERNAL_STORAGE"/> 权限流程 Android系统从6.0开始对一些危险的权限进行了动态获取权限 下图是动态获取权限的额流程图 ?...(new String[]{Manifest.permission.RECORD_AUDIO}, 0x01); //用new String[]的原因是可以在String[]中存储多个需要的权限

    2.2K40

    前端day11-JS学习笔记(构造函数、对象的API、作用域、arguments关键字)

    17 /*年月日时打印*/ //1.打印当前年份 console.log ( date.getFullYear () );//2018 //2.打印当前月份 范围:0-11...3.1作用域:变量起作用的范围 js中只有两种:全局作用域 局部作用域 1.全局作用域:变量在任何地方起作用 全局变量:在函数外面声明 2.局部作用域:变量只能在函数内部起作用 局部变量:在函数内部声明...3.2-作用域链 1.作用域链是怎么来的 默认情况下,我们的js代码处于全局作用域,当我们声明一个函数时,此时函数体会开辟一个局部作用域, 如果我们在这个函数体中又声明一个函数,那么又会开辟一个新的局部作用域...,以此类推,就会形成一个作用域链 2.变量在作用域链上的访问规则 就近原则:访问变量时,会优先访问的是在自己作用域链上声明的变量,如果自己作用域链上没有声明这个变量,那么就往上一级去找有没有声明这个变量...,如果有就访问,如果没有就继续往上找有没有声明,直到找到0级作用域链上,如果有,就访问,如果没有就报错 注意点:js中只有函数才可以开辟作用域,其他的任何语句都不可以 3.3-js预解析 为什么要有预解析机制

    84310

    11期前端冲刺必备指南-执行上下文作用域链闭包一等公民

    (全局环境记录在逻辑上是单个记录,但是它被指定为封装对象环境记录和声明性环境记录的组合) 声明性环境记录(绑定了包含在其作用域内声明定义的标识符集),就是它存储变量和函数声明,功能代码的词法环境包含一个声明性环境记录...在函数上下文情况下,参数列表也会被加入到变量对象中作为属性,变量对象与当前作用域相关。 不同作用域的变量对象互不相同,它保存了当前作用域的所有函数和变量。...JavaScript采用词法作用域,也就是静态作用域,函数的作用域在函数定义的时候就决定了。 1.6 动态作用域 动态作用域,函数的作用域是在函数调用的时候才决定的。...闭包是一个可以访问外部作用域的内部函数。通过 var 创建的变量只有函数作用域,通过 let 和 const 创建的变量既有函数作用域,也有块作用域。...da()函数的词法作用域 外部作用域执行完毕后,内部函数还在(在其他地方被引用),闭包才真正发挥作用。

    88110

    python 基础知识第11讲:函数的返回值、作用域、命名空间、递归、高级函数

    函数的作用域 作用域指的是变量生效的区域 在Python中有2种作用域 1 全局作用域 全局作用域在程序执行时创建,在程序结束时销毁; 所以函数以为的区域都是全局作用域; 在全局作用域中定义的变量...,都属于全局变量,全局变量可以在程序汇总的任意位置访问; 2 函数作用域 函数作用域在函数调用时创建,在调用结束时销毁; 函数每调用一次就会产生一个新函数的作用域; 在函数作用域中定义的变量 都是局部变量...,它只能在函数内部被访问; 示例代码: a = 20 b = 20 def fn(): a = 10 #a定义在函数内部,所以它的作用域就是函数内部,函数外部是无法访问的 print('...就是修改全局变量 a = 10 print('函数内部:','a =',a) fn2() print('函数外部:','a =',a) 4.命名空间 命名空间实际上就是一个字典,是一个专门用来存储变量的字典...使用locals()来获取当前作用域的命名空间 如果在全局作用域中调用locals()函数则获取全局作用域命名空间; 如果在函数作用域中调用locals()则获取函数命名空间; locals(

    89820

    【Android 应用开发】BluetoothDevice详解

    需要权限 android.permission.BLUETOOTH : 允许程序连接到已配对的蓝牙设备, 请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作; android.permission.BLUETOOTH_ADMIN..., 包含EXTRA_DEVICE附加域, 该附加域中存放的是BluetoothDevice对象, 需要BLUETOOTH权限; String ACTION_ACL_DISCONNECTED : android.bluetooth.device.action.ACL_DISCONNECTED..., 该广播附加域有 EXTRA_DEVICE, EXTRA_BOND_STATE; 需要BLUETOOTH权限; String ACTION_FOUND : android.bluetooth.device.action.FOUND..., 值为12; 远程设备已经匹配; 本地存储了一个该远程设备的共享连接, 本地设备和远程设备之间的通信可以被认证和加密; 这个连接不是已经连接成功, 时刻保持连接状态, 这个连接的作用是, 下次连接的时候不用再次建立新的蓝牙连接...; 绑定中 : intBOND_BONDING, 值为11; 本地设备与远程设备正在匹配中; 未匹配 : intBOND_NONE, 值为10; 本地设备与远程设备没有连接, 本地不存在与远程设备共享的连接

    1.9K30

    Android 11 开发者常见问题: 存储 | FAQ・第二期

    因此,在 Android 11 上,拥有可读取外部存储权限的应用,均可在分区存储环境中通过文件路径访问文件。...目标版本为 Android 11 (API 级别为 30) 并使用 SAF 的应用,将不会被授予某些目录访问权限,例如 SD 卡上的根目录和下载目录。...对于选择退出分区存储的应用,它们何时开始必须兼容分区存储? 在运行 Android 11 或更高版本的设备上。当目标版本被设置为 Android 11 或更高版本时,应用便会被放入到分区存储中。...建议使用什么方法来迁移分区存储之外的数据? preserveLegacyExternalStorage 标记允许应用在升级系统时保留原有存储权限,即使是升级至 Android 11。...需要注意的是,在 Android 11 上这个标记对新安装的应用起不到任何作用。将目标版本设为 Android 11 之前,请修改代码以适配分区存储。

    1.1K10

    Android 11新特性,Scoped Storage又有了新花样

    其中一个可能需要适配的地方是Android 11的权限变更,关于这部分内容我在 PermissionX现在支持Java了!还有Android 11权限变更讲解 这篇文章中已经做了比较详细的讲解。...10适配要点,作用域存储 。...其实如果你的应用程序已经按照 Android 10适配要点,作用域存储 这篇文章中讲解的方式对Scoped Storage进行了适配,那么恭喜你,现在你什么都不需要做,就已经能够适配Android 11...拥有对整个SD卡的读写权限,在Android 11上被认为是一种非常危险的权限,同时也可能会对用户的数据安全造成比较大的影响。 但文件浏览器就是要对设备的整个SD卡进行管理的,这怎么办呢?...这些功能我在 Android 10适配要点,作用域存储 这篇文章中都进行了演示。 但是,假如你要修改其他应用程序所贡献的数据,那不好意思,Scoped Storage是不允许你这样做的。

    1.6K21

    【Android 内存优化】Android 原生 API 图片压缩代码示例 ( PNG 格式压缩 | JPEG 格式压缩 | WEBP 格式压缩 | 动态权限申请 | Android10 存储策略 )

    10 文件访问 ---- 文件存储相关官方参考资料 : Android 11 中的存储机制更新 Android storage use cases and best practices 应用数据和文件...将图片压缩后 , 存储到 SD 卡中 , 这里 涉及到了在 Android 10 系统中动态申请权限 , 设置旧的存储访问策略 ( 该策略将在 Android 11 中无效 ) ; 这里简要介绍暂时性的解决方案...AndroidManifest.xml 中配置 SD 卡权限 , 及旧存储策略 : ① SD 卡权限 : 配置 SD 卡读写权限 ; android:requestLegacyExternalStorage="true" 配置旧存储策略 , Android 11 将禁止该功能 --> 存储策略 动态申请权限 即可在 Android 10 中访问 SD 卡 , 如果在 Android 11 访问 , 查看章节开始的文档 ; 四、 完整源码示例 ---- 图片压缩源码示例 : 压缩质量

    76120

    【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例)

    局部引用 作用域 IV . 局部引用 产生 与 释放 V . 局部引用 代码示例 I . JNI 引用数据类型 ---- 1 ....局部引用 作用域 ---- 1 . 局部引用作用域 : 局部引用只能在当前作用域有效 ; 超出作用域 手动释放 上面 两种情况 都会导致 局部引用变量 失效 ; 2 ....局部引用作用范围 : ① 空间 : 不能 跨线程 , 跨方法调用 , 仅在本作用域有效 ; ② 时间 : 创建后可以使用 , 手动释放 或 作用域结束 引用被释放不可使用 ; IV ....超出作用域 手动释放 上面 两种情况 都会导致 该局部变量都会失效 局部引用作用范围 :...空间 : 不能 跨线程 , 跨方法调用 , 仅在本作用域有效 时间 : 创建后可以使用 , 手动释放 或 作用域结束 引用被释放不可使用 局部引用 创建

    62220
    领券