是否有一个简单的API调用可以告诉我在Android 10或更高版本上运行的应用是否必须使用范围存储访问权限,即是否禁用了“旧版外部存储”(又称为“旧版外部存储”)?请注意,即使AndroidManifest.xml中的应用程序也声明了以下部分:
android:requestLegacyExternalStorage="true"
由于将来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.
}
我想我曾经见过一个新的API可以检测到这一点,但现在找不到该文章了...
答案 0 :(得分:3)
您可以在android.os.Environment
中使用以下两种方法:
isExternalStorageLegacy(File path)
返回给定路径上的共享/外部存储媒体是否为旧版视图,其中包含该应用程序不拥有的文件。
isExternalStorageLegacy()
返回主共享/外部存储媒体是否为旧版视图,其中包含该应用程序不拥有的文件。
此值可能与应用清单中
requestLegacyExternalStorage
请求的值不同,因为应用可能会基于首次安装的时间继承其旧状态。非传统应用可以继续通过
MediaStore
发现和读取属于其他应用的媒体。
以防万一,您发现可以访问旧存储,我个人认为最好将数据迁移到作用域存储上并使用它,因为旧存储可能会在没有警告的情况下停止工作。