NearbyConnection:payload.asFile().asJavaFile() 在最初未授予存储权限后重试保存文件时为空

NearbyConnection: payload.asFile().asJavaFile() is null when retrying to saveFile after storage permissions initially not granted

大家好,我不确定这个问题是出自 google 附近连接 (https://github.com/butchmarshall/react-native-google-nearby-connection) 的反应本机包装器还是附近连接本身。当权限最初未 g运行ted 时,我在重试保存文件负载时遇到问题,因为库声明 payload.asFile().asJavaFile() 为空。两种情况如下:

场景 1) Read/Write 授予存储权限,用户通过 Nearby Connection 交换数据,调用 saveFile(serviceId,endpointId,payloadId) 并顺利保存文件.
场景 2) 用户没有 g运行ted 存储权限并且调用了 saveFile(serviceId,endpointId,payloadId),returns 正如预期的那样拒绝了承诺。参数 serviceId, endpointId, and payloadId 存储在别处,以便可以提示用户 g运行t 权限并重试保存。重试后,执行失败,因为 payload.asFile().asJavaFile() returns null.

I 运行 adb logcat 在成功执行(最初 g运行ted 权限)和失败情况(在 g运行ted 权限后重试)在记录有效载荷时我看不出有什么不同。以下是失败案例的日志:

03-24 14:31:03.805 24644 26856 V NearbyConnection: saveFile from service com.google.myApp.v1 and endpoint hT4- and payload -6821529802993021226
03-24 14:31:03.805 24644 26856 V NearbyConnection: Payload com.google.android.gms.nearby.connection.Payload@16edba2
03-24 14:31:03.805 24644 26856 V NearbyConnection: payload.getType() 2
03-24 14:31:03.805 24644 26856 V NearbyConnection: payloadFileData  awesomePhoto.WEBP:{"description":"a flower"}
03-24 14:31:03.805 24644 26856 V NearbyConnection: payloadFilename awesomePhoto.WEBP
03-24 14:31:03.805 24644 26856 V NearbyConnection: payloadMetadata {"description":"a flower"}
03-24 14:31:03.806 24644 26856 V NearbyConnection: Cannot convert to file.

Cannot convert to File 第 1501 行 https://github.com/butchmarshall/react-native-google-nearby-connection/blob/44f1699812c1f9cce37440294d7de1df438b75af/android/src/main/java/com/butchmarshall/reactnative/google/nearby/connection/NearbyConnectionModule.java#L1501payload.asFile().asJavaFile() == null 返回的内容。我感到困惑的是,似乎有效载荷本身存在于我登录的 adb logcat 中,因为 payload.getType() 工作正常返回 2.

问题 1:初始权限失败是否会导致负载文件内容以某种方式在 NearbyConnection 缓存中被破坏,因此没有任何东西可以调用 payload.asFile().asJavaFile()?我发现 st运行ge 调用 payload.getType() 有效但 asFile() 失败。

问题 2:是否可以在发出请求的内部应用程序中存储 NearbyConnection 负载文件,而无需 request/grant 外部存储权限?

When a file is received, it is saved in the Downloads folder (DIRECTORY_DOWNLOADS) on the recipient's device with a generic name and no extension.

来源:https://developers.google.com/nearby/connections/android/exchange-data#file

Assumption/Hypothesis:在传递最终负载后,Nearby Connections 尝试写入文件,如果未提供权限,则会失败。因此,无论之后是否获得权限,最终的有效负载仍将没有关联的文件,因此将永远失败。如果这是正确的,那么除了重新发送我猜的文件之外别无选择?

我认为不正确:~~ 我假设在某些时候这个文件数据是垃圾收集的,因为它最终会填满应用程序,使其在整个应用程序生命周期中都存在。在这种情况下,这会立即发生吗? ~~

如有任何想法,我们将不胜感激。

Github 问题https://github.com/butchmarshall/react-native-google-nearby-connection/issues/4

尽管您的应用没有 READ/WRITE_EXTERNAL_STORAGE,但文件已保存。这是因为 Play 服务 API 运行 在特权进程中,与您的应用程序分开。即使您的应用缺少权限,Play 服务仍然可以写入文件。不幸的是,运行 在一个单独的进程中确实会阻止 Nearby Connections 写入您的私人应用程序存储。这也意味着,即使您无法读取该文件,您仍然负责清理该文件,否则它将无限期地保留在光盘上。

为了进一步说明问题,由于权限不足,您无法读取该文件。此失败会在您收到 onPayloadReceived 时被缓存。我将提交一个错误以避免缓存失败,但修复和发布新 SDK 需要很长时间。解决方法是...

  • 在文件发送到您的设备之前尽快请求许可。
  • 通过 ~/Downloads/Nearby/{payloadId} 手动查找文件。请注意,不建议这样做,因为文件路径可能随时更改(尽管不太可能)。这类似于使用反射。