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

Posted SDDY_xiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理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(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;
}

以上是关于处理Android SDK 29及以上版本,读取不到/storage/emulated/0/(/storage/sdcard/)路径下文件问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 29及以上高版本获取SD外部存储器目录

Android 29及以上高版本获取SD外部存储器目录

Unity在Android 6.0及以上版本弹出权限申请窗口的问题

如何在 Android Q 及以上版本中保存/读取文件(即 txt、mht、pdf 等),因为 getExternalStoragePublicDirectory() 已弃用 [重复]

安卓不使用第三方SDK怎么开发街景地图

安卓11及以上版本读取本地文件的方法