首页 > 解决方案 > NearbyConnection:在最初未授予存储权限后重试 saveFile 时,payload.asFile().asJavaFile() 为 null

问题描述

大家好,我不确定这个问题是来自于谷歌附近连接(https://github.com/butchmarshall/react-native-google-nearby-connection)的反应原生包装器还是附近连接本身。当最初未授予权限时,我无法重试保存文件有效负载,因为库声明该权限payload.asFile().asJavaFile()为空。两种情况如下:

场景 1)给定读/写存储权限,用户通过附近连接交换数据,saveFile(serviceId,endpointId,payloadId)被调用并且文件保存没有问题。
场景 2)用户未授予存储权限并被saveFile(serviceId,endpointId,payloadId)调用,它按预期返回拒绝的承诺。参数 serviceId, endpointId, and payloadId存储在别处,以便可以提示用户授予权限并重试保存。重试时,执行失败,payload.asFile().asJavaFile()返回 null。

adb logcat在成功执行(最初授予权限)和失败情况(在授予权限后重试)期间都运行了,并且在记录有效负载时看不到差异。以下是失败案例的日志:

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/上返回的内容附近/连接/NearbyConnectionModule.java#L1501payload.asFile().asJavaFile() == null。我感到困惑的是,有效载荷本身似乎存在于我登录的内容中adb logcatpayload.getType()返回 2 时运行良好。

问题 1:初始权限失败是否会导致负载文件内容在 NearbyConnection 缓存中以某种方式被破坏,因此没有什么可调用payload.asFile().asJavaFile()的?我觉得调用payload.getType()有效但asFile()失败很奇怪。

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

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

假设/假设:交付最终有效负载后,附近的连接尝试写入文件,如果未提供权限,则会失败。因此,无论之后是否授予权限,最终的有效负载仍然没有关联的文件,因此将永远失败。如果这是正确的,那么除了重新发送我猜的文件之外别无选择?

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

这里的任何想法将不胜感激。

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

标签: react-nativegoogle-nearby

解决方案


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

要详细说明该问题,由于缺少权限,您无法读取该文件。此故障在您获得 onPayloadReceived 时被缓存。我将提交一个错误以避免缓存失败,但修复和发布新 SDK 需要很长时间。解决方法是...

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

推荐阅读