如何使用存储附加服务进行 public 存储访问而不是私有存储访问?
How to use the Storage Attach Service for public storage access instead of private storage access?
问题总结
我的应用程序(开发中),当 运行 在桌面上时,可以:
- 写入和读取私有存储
- 写入和读取 public 存储。
但是,当 运行 在 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 设备进行测试。
- Pixel XL 运行宁 Android 版本 10.
- 三星 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.
问题总结
我的应用程序(开发中),当 运行 在桌面上时,可以:
- 写入和读取私有存储
- 写入和读取 public 存储。
但是,当 运行 在 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 设备进行测试。
- Pixel XL 运行宁 Android 版本 10.
- 三星 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.