ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-30 19:00:31  阅读:411  来源: 互联网

标签:emulated 读写 storage 29 Environment externalFileRootDir sdPath Android requireNon


起因:从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(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;
}

标签:emulated,读写,storage,29,Environment,externalFileRootDir,sdPath,Android,requireNon
来源: https://blog.csdn.net/SDDY_xiao/article/details/121054399

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有