以编程方式测试是否在Android 10+中禁用了旧版外部存储访问

gre*_*gko 8 android scoped-storage legacy-external-storage

是否有一个简单的API调用可以告诉我在Android 10或更高版本上运行的应用程序是否必须使用范围存储访问权限,即是否禁用了常规文件访问(又称为“旧版外部存储”)?请注意,即使AndroidManifest.xml中的应用程序也声明了:

  android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)

由于将来Google的政策更改,文件访问仍可能会被拒绝,因此测试该值是没有用的。我发现的唯一方法是测试外部存储根目录是否可读,为此,应用程序必须首先请求存储许可,如果禁用了旧存储,则该存储对其他任何东西都没有用。

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}
Run Code Online (Sandbox Code Playgroud)

我想我曾经看过一种新的API可以检测到这一点,但是现在找不到该文章了...

Zaf*_*ffy 13

您可以使用以下两种方法android.os.Environment

此值可能requestLegacyExternalStorage与应用程序清单中请求的值不同,因为应用程序可能会根据首次安装的时间继承其旧状态。

非旧版应用程序可以通过 继续发现和读取属于其他应用程序的媒体MediaStore

如果您发现您可以访问遗留存储,我个人认为最好将数据迁移到范围存储并使用它,因为遗留存储可能会在没有警告的情况下停止工作。