我正在开发一个支持通过 Android Beam 传输内容的应用程序(更准确地说,支持使用蓝牙的 NFC 发起的内容传输)。我正在使用通过 NfcAdapter 类、nameley 提供的知名 API,
nfcAdapter.setBeamPushUrisCallback(new NfcAdapter.CreateBeamUrisCallback() {
@Override
public Uri[] createBeamUris(NfcEvent event) {
if (singleItemToTransfer()) {
if (item.getLocalPath() != null) {
File file = new File(item.getLocalPath());
return new Uri[] { Uri.fromFile(file) };
} else {
// Download the content & pass the handle
// for the content being downloaded
}
}
}
}, this);
现在的问题是 Android 框架将如何处理场景,其中要传输的内容当前不可用,但需要先下载然后传输。例如,只有照片的预览可用,选择预览后,应用程序首先下载内容,然后通过 Android Beam(例如蓝牙)传输。我搜索了 arround,发现有一些方法可以获取 Android DownloadManager 当前正在下载的文件的句柄。例如,这里有一个有趣的帖子。基本上,DownloadManager 类存储了一个http列表已启动的下载及其相关状态。建议我们根据下载是否为“正在运行”、“待处理”、“已暂停”等来过滤下载。该列表可以读入游标,结果的其中一列是“COLUMN_URI”,它是下载文件的 url。
然而,关于上述解决方案,有一个问题:如果内容在云端怎么办?比如说,谷歌云端硬盘?我进一步搜索并发现了许多帖子,例如,here。显然,下载部分仍然存在。内容需要在传输之前先下载。
除了上面的问题,我还想知道如果我们首先以下载内容为目标,然后返回下载完成的文件的 URI,Android Beam 会如何行动。为了测试,我创建了一个模拟代码,比如 Thread.sleep(_some_time_); 然后在 createBeamUris() 调用中传递实际的 URI。在这种情况下,Android Beam 会提示用户检测到现场的其他设备,然后等待上面介绍的时间量,然后发出“Tap to Beam”,这通常会提供极其糟糕的用户体验(例如,其他设备的屏幕被锁定并且 NFC 关闭)。随后,我考虑为正在下载的文件传递一个 URI,然后在下载的同时传输内容!我不确定这将如何处理。恐怕修改 Android Beam 的工作方式是唯一的选择。任何提示都非常感谢!
如果您认为我遗漏了什么,请告诉我,我会更新帖子。