处理Android SDK 29及以上版本,读取不到/storage/emulated/0/(/storage/sdcard/)路径下文件问题

本文主要是介绍处理Android SDK 29及以上版本,读取不到/storage/emulated/0/(/storage/sdcard/)路径下文件问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

起因:从Android Q开始,出于数据隐私问题,Android 希望禁止应用程序操作非沙箱内的数据(即使你的应用程序获取了读写存储卡权限,也不能读写非沙盒路径下的数据)。但也提供了requestLegacyExternalStorage机制,来帮助应用使用原来的机制继续读写存储卡,此机制用于过度期间的。所以临时解决方法:

       >:  应用程序有存储卡读写权限,且在AndroidManifest.xml的application标签中设置requestLegacyExternalStorage=true,才能访问。

<application...android:requestLegacyExternalStorage="true"...
>

关联问题:

问题1.  Environment.getExternalStorageDirectory() 过期问题(在Android SDK 29及以上废弃)

解决:

// 目标SD路径:/storage/emulated/0
public static String getSDPath(Context context){String sdPath = "";boolean isSDExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); //判断SD卡是否存在if (isSDExist) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {File externalFileRootDir = context.getExternalFilesDir("");do {externalFileRootDir = Objects.requireNonNull(externalFileRootDir).getParentFile();} while (Objects.requireNonNull(externalFileRootDir).getAbsolutePath().contains("/Android"));sdPath = Objects.requireNonNull(externalFileRootDir).getAbsolutePath();} else {sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();}} else {sdPath = Environment.getRootDirectory().toString();//获取跟目录}return sdPath;
}
注意: build.gradle中的'targetSdk'值:'targetSdk 30'时:手机设置里的权限管理中'存储空间 => 访问图片、视频、音频文件',Environment.getExternalStorageDirectory()过期失效,需要使用Context.getExternalFilesDir("")'getExternalFilesDir()'的文件目录为 '/storage/emulated/0/Android/data/包名/files/Media/''targetSdk 29'时:手机设置里的权限管理中'存储空间 => 访问所有类型文件'Environment.getExternalStorageDirectory() 文件目录为 '/storage/emulated/0/'

这篇关于处理Android SDK 29及以上版本,读取不到/storage/emulated/0/(/storage/sdcard/)路径下文件问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/363632

相关文章

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(