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

为什么文件访问方法getExternalStorageDirectory()在Android10上不起作用(API29)

在Android 10(API 29)及更高版本中,文件访问方法getExternalStorageDirectory()不再起作用,这是因为Android 10引入了一种新的存储访问模型,称为Scoped Storage(作用域存储)。Scoped Storage的目的是增强应用程序的隐私和安全性,并提供更好的文件管理。

在Scoped Storage模型下,每个应用程序都有自己的私有存储空间,无法直接访问其他应用程序的文件。这意味着getExternalStorageDirectory()方法返回的路径不再是外部存储的根目录,而是应用程序的私有目录。

这种变化对开发者来说有一些影响。以下是一些解决方案和替代方法:

  1. 使用Context#getExternalFilesDir()方法:该方法返回应用程序的私有目录,可以用于存储应用程序专用的文件。例如,可以使用以下代码获取应用程序的私有目录路径:
代码语言:txt
复制
File privateDir = context.getExternalFilesDir(null);
  1. 使用MediaStore API:Scoped Storage模型鼓励开发者使用MediaStore API来管理媒体文件(如照片、视频、音频)。通过MediaStore API,可以访问公共媒体文件集合,并将应用程序的媒体文件添加到媒体库中。这样可以确保文件的访问权限和安全性。
  2. 请求特殊权限:如果应用程序需要访问其他应用程序的文件或外部存储的根目录,可以请求特殊权限。例如,可以请求READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。但是,需要注意的是,这些权限在Android 10及更高版本中已经变得更加严格,用户可能需要手动授予这些权限。

总之,Android 10引入的Scoped Storage模型对文件访问方式产生了变化,开发者需要适应新的存储访问模型,并使用替代方法来处理文件访问操作。

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

相关·内容

Android的内部存储和外部存储怎么区分?

外部私有存储位于/storage/emulated/0/Android/data/包名这个目录下,它和内部存储一样是私有的,并且其他应用程序是无法访问的,会随着应用程序的卸载而被清除。        ...2.使用哪些api进行访问?   ...context.getExternalCacheDir()      //  /storage/emulated/0/Android/data//cache   外部公有存储: Environment.getExternalStorageDirectory...() Environment.getExternalStoragePublicDirectory(String type)   参数type用于指定文件夹的类型,可以有以下取值:(getExternalFilesDir...注:Android10之后,不能再使用外部公有存储下的两个方法了,应用程序只能访问自己的外部私有目录,所以Android10之后尽量使用外部私有存储下的两个方法

72211
  • 干货 | 携程Android 10适配踩坑指南

    support-v4、appcompat-v7库也不再支持那么久远的系统了,但是它们的名字却一直保留了下来,虽然它们现在的实际作用已经对不上当初命名的原因了。...MediaStore API共享目录指定目录下创建文件或者访问应用自己创建文件,不需要申请存储权限 MediaStore API访问其他应用在共享目录创建的媒体文件(图片、音频、视频), 需要申请存储权限...2.4 兼容模式 应用未完成外部存储适配工作,可以临时以兼容模式运行, 兼容模式下应用申请存储权限,即可拥有外部存储完整目录访问权限,通过Android10之前文件访问方式运行,以下两种方法设置应用以兼容模式运行...: 1)文件迁移 文件迁移是将应用共享目录文件迁移到应用私有目录或者Android10要求的media集合目录。...允许其他应用访问,并且应用卸载后不允许删除的文件文件需要存储共享目录,应用可以选择是否进行目录整改,将文件迁移到Android10要求的media集合目录。

    3.3K77

    详解Android10的分区存储机制(Scoped Storage)适配教程

    简介 大家应该都有过这样的体会,手机用着用着里面就充斥着各种不懂的文件夹和文件。甚至是连已经删除的软件的文件夹还存在。 为什么会发生的这样的问题呢?...发布Android10的时候官方明确表态: 2020年,主要平台版本将要求所有应用都使用分区存储,无论应用的目标 SDK 级别是多少。因此,您应该提前确保您的应用能够使用分区存储。...应用自己创建的照片、视频和音频(通过MediaStore访问)。 分区存储将影响Android10系统首次安装启动、且targetSdkVersion =29的应用。...类型 位置 访问应用自己生成的文件 访问其他应用生成的的文件 访问方法 卸载应用是否删除文件 外部存储 Photo/ Video/ Audio/ 无需权限 需要权限READ_EXTERNAL_STORAGE...共享媒体集合存储 共享媒体集合存储中保存媒体文件时,需要根据文件的类型选择MediaStore。

    3.4K32

    Android 10 和Android 11的适配

    背景 最近在项目中着手做Android10和Android11 适配时候,期间遇到了不少的坑。之前有专门写过qq、微信分享的适配。但是此次针对偏业务侧适配工作的时候还是碰到了一些新的问题。...以上的场景中,涉及到了这些关键点: 把图片存储到sd卡 把绝对路径path传递给qq或者微信 1.1 直接访问sd卡的根目录 通过FileOutPutStream来完成,Android10以下都没问题...Android10 上公共目录下的图片无法通过file:// 格式去访问,提示找不到路径。如glide加载、图片选择库、裁剪框架等等都会收到影响。...但是,这里有个坑: Android10上不行,Android11上又可以!!为什么? 因为Google改回来了,让Android11支持file://格式了。。。。 (wtf?...三、终极适配方案 Android10上 开启标志位 :android:requestLegacyExternalStorage="true"来开启兼容模式,关闭分区适配,相当于targetSdkVersion

    1.4K41

    AndroidR兼容性适配指南

    为什么是暂时呢?因为只要卸载重装,就会失效了。 管理设备存储空间 从 Android 11 开始,使用分区存储模型的应用只能访问自身的应用专用缓存文件。...看到这里也许会产生疑惑,Android10中不是进行分区存储了么,这么Android11又开始能直接使用文件路径进行访问了。...也许有小伙伴问到既然Android11可以直接使用File API访问媒体文件了,那分区存储这个适配还有必要么?(PS:我知道肯定有必要,但我想知道为什么会有必要?)... Android 10 上,作用域存储环境中的应用无法使用文件路径访问文件。为了与此设计保持一致,我们当时弃用了 DATA 列。...而我们Android10适配的时候又把相关的数据文件迁移到了应用的私有空间也可以通过File API进行文件访问。 最后呢!

    2K20

    Android 10 适配攻略小结

    但是这些权限完全被滥用,造成的问题就是手机的存储空间中充斥着大量不明作用文件,并且应用卸载后它也没有删除掉。...一般我们使用 getExternalStorageDirectory() 方法获取的路径来存取文件。 因为不同厂商、系统版本的原因,所以上述的方法并没有一个固定的文件路径。...了解了上面的概念,那我们所说的外部储存访问限制,可以认为是针对 getExternalStorageDirectory() 路径下的文件。具体的规则如下表: ?...其他目录,使用 存储访问框架SAF (Storage Access Framwork) 所以Android 10上即使你拥有了储存空间的读写权限,也无法保证可以正常的进行文件的读写操作。...以前我们习惯使用 Environment.getExternalStorageDirectory() 方法,那么现在可以使用 getExternalFilesDir() 方法(包括下载的安装包这类的文件

    2K32

    【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)

    方法追踪使用流程 : ① 创建 File 对象 : 方法的执行信息 , 将被保存到该 File 文件中 ; File traceFile = new File(Environment.getExternalStorageDirectory...(), "Method_Trace"); ② 开始方法追踪 : 方法中 , 需要传入上述 File 文件的绝对路径 , 才能向该 File 文件中保存方法执行信息 ; Debug.startMethodTracing...SD 卡访问权限 : Debug.startMethodTracing(traceFile.getAbsolutePath()) 方法作用是将方法追踪信息写出到 SD 卡的文件中 , 因此这里必须 动态申请...静态声明权限 : AndroidManifest.xml 文件中添加 SD 卡的访问权限 : 最后两个是 SD 卡访问权限 ; <!...方法之前调用 , 否则开始方法追踪没有 SD 卡访问权限的情况下执行 , 直接崩溃 ; 3.

    2.7K30

    Qt(MinGW ) Windows下创建动态库

    大家肯定注意到标题中Qt后面括号中的minGW,为什么要加上minGW呢?先卖个关子,后面的介绍中会解释的。...HEADERS += testadd.h unix { target.path = /usr/lib INSTALLS += target } 与Linux下相比,去掉了版本号的设置,因为添加上不起作用...生成共享库的效果 由于我们pro中指定了生成路径,所以生成的文件都在dll文件中。这里面要注意的是,生成的有两个文件,一个是.a文件链接过程中使用,另一个是.dll文件,在运行过程中使用。 ?...没有找到这个文件?再一看,后面多了一个d,默默地删掉解决问题。 因为刚才勾选了为debug版本添加’d’作为后缀。。 ②运行直接崩溃 生成库的时候不还有一个文件么,这时候它就该起作用了。...所以这也是我为什么要在标题中加入MinGW的原因了。另外,使用MinGW的工程也可以直接链接.lib文件,这个就之后再了解了。 ? 欢迎大家关注公众号:Pou光明

    2.6K10

    android共享文件夹_安卓多用户共享文件

    其他的文件Uri是file://, 表示这个是一个文件。这个uri是通过Uri.fromFile(File file)方法生成。 Android N 之前,这些uri可以传递到其他应用。...://URI),并授予 URI 临时访问权限。...FileProvider这个类就是把一个文件File,转换为 content://URI的 FileProvider是ContentProvider子类,所以FileProvider的使用方法,和ContentProvider...resource:自定义的xml文件(下面会介绍) 2、res目录下新建一个xml文件夹,并且新建一个file_paths的xml文件(如下图) 3、打开file_paths.xml文件,添加指定的分享目录...com.google.android.packageinstaller/u0a26} (pid=27107, uid=10026) that is not exported from UID 10004 以下这两个问题,可参考这篇文章 为什么

    3.5K40

    Android 一起来看看 7.0 的新特性 FileProvider

    要应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。...如需了解有关权限和共享文件的详细信息,请参阅 共享文件 FileProvider 实际上是 ContentProvider 的一个子类,它的作用也比较明显,file://Uri 不给用,那么换个 Uri...我们先创建一个名为 res/xml/filepaths.xml 的新文件 ? filepaths.xml filepaths.xml 文件中,便可以指定文件存储的区域和路径。...()/pics 当这么声明以后,代码可以使用你所声明的当前文件夹以及其子文件夹 可能你会有疑问,为什么要写这么个 xml 文件,有啥用呢?...总不能使用文件路径吧,那不是骗自己么 所以,需要一个虚拟的路径对文件路径进行映射,所以需要编写个 xml 文件,通过 path 以及 xml 节点确定可访问的目录,通过 name 属性来映射真实的文件路径

    1.6K40

    AndroidQ兼容性适配指南

    ,并限制文件混乱的情况,Android Q修改了APP访问外部存储中文件方法。...分区存储模型下,SD卡的公共目录是不让访问的,除了共享媒体的那几个文件夹。...无法访问存储设备上的文件 问题原因1: 直接使用路径访问公共目录文件。 问题分析1: Android Q上,APP默认只能访问外部存储设备上的App-specific目录。...解决方法1: 参见使用MediaStore访问公共目录和使用SAF选择单个文件,使用MediaStore接口访问公共目录中的多媒体文件,或者使用 SAF访问公共目录中的任意文件。...问题原因2: 使用MediaStore接口访问非多媒体文件。 问题分析2: Android Q上,使用MediaStore接口只能访问公共目录中的多媒体文件

    7.1K30

    salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)

    这种场景往往更会出现在数据不止存储salesforce端,还有其他平台有数据的存储或者访问。这种情况下可以使用Streaming API。...Delete操作是否会生成通知,api29以后可用; NotifyForOperationUndelete:UnDelete操作是否会生成通知,api29以后可用; NotifyForOperationUpdate...:Update操作是否会生成通知,api29以后可用; Query:SOQL语句决定了哪些数据符合触发的事件后会发送到渠道。...这些字段有几个需要详细的描述一下: Query:QueryPushTopic的作用不言而喻,定义了哪些数据可以满足条件进行推送。Query语法和SOQL基本相同,但是有一些情况不支持。...如果订阅是页面或者组件中使用,可以使用Cometd进行操作,Cometd提供了基本方法用来实现客户端订阅操作,详见Cometd API。

    1.7K80

    拖不得了,Android11真的来了,最全适配实践指南奉上

    ” 关于分区存储,Android10就已经推行了,简单的说,就是应用对于文件的读写只能在沙盒环境,也就是属于自己应用的目录里面读写。其他媒体文件可以通过MediaStore进行访问。...但是android10的时候,Google还是为开发者考虑,留了一手。...已经出来很久了,所以资料还是很多的,这里推荐几篇 访问应用专属文件 Android 10适配要点,作用域存储 AndroidQ(10)分区存储完美适配 说到这里可能又有人问了,那我的应用就是个手机管理器...媒体文件访问权限 ⭐ “为了保证用户隐私的同时可以更轻松地访问媒体,Android 11 增加了以下功能。执行批量操作和使用直接文件路径和原生库访问文件。...也就是除了 MediaStore API之外还有两种方式可以访问媒体文件: File API。 原生库,例如 fopen()。 那Android10咋办呢??

    7K340266

    规则换了没关系,照样优雅的查看答案

    三篇教程似乎全新的单元上不起作用。基于他们的要求,我又去重新寻找新的方法经过了近20分钟的寻找,我最终找到了一个全新的方法完美解决了问题,请看以下视频。...此处不要直接打开具体练习 ; 在此处点击右键,选择“检查”,当然,也可以按“F12”; 点击跳出来的界面右上角的“Network”; 此时再点击你要做的练习; 本来空着的右侧这时候便会多出一串文件...,我们只需点击“initPage.php”这个文件就好了; 在出现的一串代码中,我们可以看到key这一行,旁边的就是答案; 当做完这一题之后,点击next进入下一个界面是“Netwok”那一栏中又会多出一些文件

    86310
    领券