热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

起因:从AndroidQ开始,出于数据隐私问题,Android希望禁止应用程序操作非沙箱内的数据(即使你的应用程序获取了读写存储卡权限,也不能读写非沙盒路径下的数据)。但也提供了r

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

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

...
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(Environment.MEDIA_MOUNTED);
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;
}



推荐阅读
author-avatar
sotoloraboin_678
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有