我正在尝试使用 googles Nearby Connections API 传输文件。在很大程度上,我可以让传输的所有组件正常工作,以便传输所有文件数据,但问题是文件数据随后存储在 Nearby 的范围存储中,因此我无法从我的应用程序访问它以便能够处理将该数据转换为适当的文件类型,然后根据需要保存和重命名。
我用来尝试处理有效负载的当前方法是
private void processFilePayload(long payloadId) {
// BYTES and FILE could be received in any order, so we call when either the BYTES or the FILE
// payload is completely received. The file payload is considered complete only when both have
// been received.
Payload filePayload = completedFilePayloads.get(payloadId);
String filename = filePayloadFilenames.get(payloadId);
if (filePayload != null && filename != null) {
completedFilePayloads.remove(payloadId);
filePayloadFilenames.remove(payloadId);
// Get the received file (which will be in the Downloads folder)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
File fromPayload = filePayload.asFile().asJavaFile();
Uri uri = Uri.fromFile(fromPayload);
try {
// Copy the file to a new location.
InputStream in = getApplicationContext().getContentResolver().openInputStream(uri);
copyStream(in, new FileOutputStream(new File(getApplicationContext().getCacheDir(), filename)));
} catch (IOException e) {
// Log the error.
Log.e("copy file", e.toString());
} finally {
// Delete the original file.
getApplicationContext().getContentResolver().delete(uri, null, null);
}
} else {
File payloadFile = filePayload.asFile().asJavaFile();
// Rename the file.
payloadFile.renameTo(new File(payloadFile.getParentFile(), filename));
}
}
}
});
由于 android 11 的范围存储能够访问文件,因此需要使用文件 Uri 来创建带有内容解析器的输入流来访问文件。
根据 Nearby 文档,应该有一个方法 Payload.File.asUri 所以我可以使用该行Uri payloadUri = filePayload.asFile().asUri();
,但尽管使用了 Nearby 的最新版本,但这实际上在 API 中不可用。
除此之外,Payload.File.AsJavaFile()
应该根据 google Nearby 文档弃用
对于类似问题,我已经看到了一些其他答案,其中建议使用 Media.Store 但这不可能,因为该文件没有任何扩展名,因此不会显示为任何特定的文件类型。
注意:我在清单和运行时都请求了读/写外部存储权限。