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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式测试是否在Android 10+中禁用了旧版外部存储访问相关的知识,希望对你有一定的参考价值。

是否有一个简单的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可以检测到这一点,但现在找不到该文章了……

答案

您可以从android.os.Environment使用这两种方法:

  • android.os.Environment

    返回给定路径上的共享/外部存储媒体是否为旧视图,其中包含应用程序不拥有的文件。

  • isExternalStorageLegacy(File path)

    返回主共享/外部存储媒体是否为旧视图,其中包含该应用程序不拥有的文件。

此值可能与应用程序清单中isExternalStorageLegacy(File path)请求的值不同,因为应用程序可能会基于首次安装的时间继承其旧状态。

非传统应用程序可以继续通过isExternalStorageLegacy()查找和读取属于其他应用程序的媒体。

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

以上是关于以编程方式测试是否在Android 10+中禁用了旧版外部存储访问的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio上以编程方式检查自动启动权限是启用还是禁用

如何在 Android 中以编程方式启用禁用 GPS? [复制]

在 Android 中以编程方式启用/禁用屏幕镜像。 [根]

如何在android中以编程方式启用位置访问?

iOS 模拟器 - 以编程方式禁用连接硬件键盘

如何在android中以编程方式关闭3G数据连接?