如何使用存储附加服务进行 public 存储访问而不是私有存储访问?

How to use the Storage Attach Service for public storage access instead of private storage access?

问题总结

我的应用程序(开发中),当 运行 在桌面上时,可以:

但是,当 运行 在 Android 上时,只能访问私有存储。

如何重现问题

我不分享我的项目代码库的摘录,而是引用我们共享和拥有的另一个代码库 - gluon-connect-file-provider project in Gluon Samples。示例应用程序仅演示私有存储的使用情况。 None演示public存储使用,所以在gluon-connect-file-provider项目中,可以在com.gluonhq.samples.connect.file.Main.java中做如下改动:

之前

static {
    ROOT_DIR = Services.get(StorageService.class)
                .flatMap(StorageService:getPrivateStorage)
                .orElseThrow(() -> new RuntimeException("Error retrieving private storage"));
}

之后

static {
    ROOT_DIR = Services.get(StorageService.class)
                .flatMap(s -> s.getPublicStorage("Gluon"))
                .orElseThrow(() -> new RuntimeException("Error retrieving public storage"));
    ROOT_DIR.mkdir();
}

此更改后在桌面上启动应用程序时,您可以首先观察在您的计算机上创建的目录 ~/Gluon。然后,当您在应用程序的对象查看器屏幕中切换复选框 on/off 时,您还可以确认基础 JSON 文件 ~/Gluon/user.json 正在更新。因此,我们可以同意 public 存储有效。

但是,当部署到 Android 时,我们可以在 mvn -Pandroid gluonfx:nativerun[=66 期间在滚动终端中看到与文件权限相关的故障=].首先,Gluon 目录在启动时创建失败,随后尝试写入 user.json 文件。

我认为解决方案是在项目中定义文件src/android/AndroidManifest。xml。在 target/gluonfx/aarch64-android/gensrc/android/AndroidManifest.xml 找到的默认不包括以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

因此,我将生成的 AndroidManifest.xml 文件复制到 src/android,包括这些条目。尽管 Android 设置显示我的应用程序具有存储权限,但这仍然没有解决问题。

注意 - 在准备此 post 请求您的帮助时,我注意到,没有配置 src/android/AndroidManifest.xml 文件gluon-connect-file-provider 的外部 READ/WRITE 权限,Android 设备已经显示部署的应用程序已启用存储权限。

我使用了两种不同的 Android 设备进行测试。

  1. Pixel XL 运行宁 Android 版本 10.
  2. 三星 S9 运行宁 Android 版本 10.

我使用最新的 GluonHQ Attach 依赖项 4.0.13 以及我发现的最旧的可用版本 4.0.7 进行了测试。

存储附加服务是否需要执行更多操作才能允许 public 访问 Android 上的存储?请告诉我还有什么方法可以修改 gluon-connect-file-provider 应用程序,谢谢。

分辨率

更新至 Gluon Attach 4.0.14.

<dependency>
    <groupId>com.gluonhq.attach</groupId>
    <artifactId>storage</artifactId>
    <version>4.0.14</version>
</dependency>

通过此更新,存储服务将允许您访问预先存在的 Android 文件夹,例如“文档”。或者,如上面 post 的代码摘录所示,您可以定义自己的新目录,例如“Gluon”,或者以您自己的 App 命名该文件夹。

额外

除了Storage Service, file sharing via the Share Service is now available on Android. Its JavaDoc states Storage Service as a requirement to use Share Service. Below is a quote from its documentation之外,这次附加更新的另一个级联结果是:

Note that on Android, the file has to be located in a public folder (see StorageService#getPublicStorage), or sharing it won't be allowed.