0

问题总结

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

  • 写入和读取私有存储
  • 写入和读取公共存储。

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

如何复制问题

我不分享我的项目代码库的摘录,而是参考我们共享和拥有的另一个代码库 - Gluon Samples中的gluon-connect-file-provider项目。示例应用程序仅演示私有存储的使用。没有演示公共存储使用,因此在 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 。然后,当您在应用程序的对象查看器屏幕中打开/关闭复选框时,您还可以确认底层 JSON 文件~/Gluon/user.json正在更新。因此,我们可以同意公共存储工作。

但是,当部署到 Android 时,我们可以在mvn -Pandroid gluonfx:nativerun期间在滚动终端中看到与文件权限相关的故障。首先,启动时无法创建 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 设置显示我的应用程序具有存储权限,但这仍然没有解决问题。

注意 - 在准备这篇文章寻求您的帮助时,我注意到,在没有为 gluon-connect-file-provider 提供具有外部读/写权限的src/android/AndroidManifest.xml文件的情况下,Android 设备已经显示了部署的应用程序已启用存储权限。

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

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

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

存储附加服务是否还需要做更多的事情才能允许 Android 上的公共存储访问?请告诉我如何修改 gluon-connect-file-provider 应用程序以使其如此,谢谢。

4

1 回答 1

0

解析度

更新到Gluon Attach 4.0.14。

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

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

额外的

此 Attach 更新的另一个级联结果是,除了Storage Service之外,现在可以在 Android 上通过Share Service进行文件共享。它的JavaDoc将存储服务声明为使用共享服务的要求。以下是其文档的引述:

请注意,在 Android 上,该文件必须位于公共文件夹中(请参阅 StorageService#getPublicStorage),否则将不允许共享它。

于 2021-10-07T15:43:21.407 回答