14

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

  android:requestLegacyExternalStorage="true"

由于未来谷歌政策的变化,文件访问仍然可能被拒绝,所以测试这个值是没有用的。我发现的唯一方法是测试外部存储根目录是否可读,但为此,应用程序必须首先请求存储权限,如果禁用旧版存储,这对其他任何事情都无用。

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.
}

我想我曾经看过一个新的 API 来检测这一点,但再也找不到那篇文章了……

4

1 回答 1

15

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

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

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

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

于 2019-10-18T13:02:07.417 回答