问题总结
我的应用程序(开发中)在桌面上运行时,可以:
- 写入和读取私有存储
- 写入和读取公共存储。
但是,在 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 设备进行测试。
- Pixel XL 运行 Android 版本 10。
- 运行 Android 版本 10 的三星 S9。
我使用最新的 GluonHQ Attach 依赖项 4.0.13 以及我发现的最旧的 4.0.7 进行了测试。
存储附加服务是否还需要做更多的事情才能允许 Android 上的公共存储访问?请告诉我如何修改 gluon-connect-file-provider 应用程序以使其如此,谢谢。