【问题标题】:Transfer large files between Android and Node.js在 Android 和 Node.js 之间传输大文件
【发布时间】:2018-07-19 14:44:15
【问题描述】:

我有一个拍照 Android 应用程序(用 React Native 编写,但如果需要,我可以添加原生模块)与用户计算机上的画廊类型应用程序配对(用 Electron 和 React 编写)。照片的数量可能很大(我们一次有超过一千张照片),并且需要将它们传输、未压缩和未裁剪到计算机应用程序。我需要一种可靠的方法来做到这一点,而无需先通过 Internet 路由数据。

我尝试过的事情

Node USB:看起来像一个不错的库,但是如果不在用户的计算机上安装驱动程序就无法使用。然后驱动程序似乎替换了默认的 Windows USB 驱动程序,并且手机变得无法通过正常方式访问(在 Windows 中打开文件资源管理器)。也许有一些方法可以“即时”切换驱动程序,仅在传输照片时使用驱动程序,然后在完成后将其切换回系统驱动程序?

ADB: 这是我尝试过的原始解决方案,它完全符合我的需要,但存在两个破坏性问题:第一,手机需要启用开发模式,以及对于两个,ADB 似乎无法识别所有设备(例如,我们在让它与 LG V20 一起工作时遇到了很多麻烦)。这个问题的理想答案是没有这两个问题的亚行。

WiFi路由:我们将手机连接到与主机相同的WiFi网络,使用WebSockets通过互联网握手IP,然后通过WiFi网络发起直接连接。如果我找不到任何其他解决方案,这很可能是我会选择的解决方案。此选项的最大问题是需要相对大量的手动设置。我们的用户往往不太精通技术,我不知道假设他们家中有 WiFi 有多么合理。无论如何,这不是转移的唯一选择。此外,通过无线网络传输千兆字节的照片将导致同一网络上的每个人的速度变慢。

绑定路由:我们将手机绑定到计算机,并以与上述步骤大致相同的方式启动直接连接。这种方法的缺点是只有带有 SIM 卡的手机才能激活网络共享(并非我们所有的手机都有 SIM 卡,因为连接不是我们需要的主要目的),而且计算机上的所有其他流量现在都将通过电话路由,这对拥有 SIM 卡的客户的数据上限不利。此外,无法以编程方式打开网络共享,只能调出网络共享菜单;这不是一个太大的交易破坏者,但其他两个非常重要。

蓝牙:基本满足我的要求,但是数据传输率太低了,比WiFi低一个数量级。

WiFi Direct:我实际上并没有尝试过,因为我找不到让 PC 接受 WiFi Direct 连接的有效方法。它保证了卓越的速度,但我发现没有任何模块或库可以帮助我启用它。

SD 卡:最低技术含量的方法,只需将所有内容保存到 SD 卡中,然后让客户将卡取出并将其插入计算机。除了需要 SD 卡端口(保证既不用于客户的计算机也不用于他们的手机),这将与此相关。

显而易见的:手动将所需文件从手机拖放到 PC。这就是我们现在做事的方式,它充满了问题。由于某种原因,在传输过程中,文本文件的最后 15-20 个字符被截断;由于 MTP 不强制在手机上重新扫描媒体的已知问题,设备上的许多照片最初并未显示;用户有时会将文件放在错误的位置,从而导致不必要的支持电话。这种方法肯定需要更换。

我已经为这个问题寻找解决方案已经两个月了,很难相信没有人有这样的 Android 用例。很明显,Android 和 PC 之间的 USB 通信并非微不足道,我敢肯定有一些程序可以做到这一点,Windows 可以开始使用。然而,尽我所能,没有开箱即用的解决方案。以前有没有人处理过这样的问题?你的解决方案是什么?您将如何解决这个问题?

【问题讨论】:

    标签: android node.js react-native usb


    【解决方案1】:

    在Android上下载大文件时推荐使用下载管理器,它支持进度条、通知等很多原生功能,下载任务由操作系统处理,效率更高。

    React Native Fetch Blob 库支持此功能

    【讨论】:

    • 我的OP指定照片一定不能先通过互联网路由;这需要是本地转移。最多可以有 1 GB 的照片,这对于有数据上限的客户来说是很多数据。有没有办法在本地使用 React Native Fetch Blob?
    【解决方案2】:

    您真的不需要通过互联网路由数据。 您可以通过互联网交换元数据: 使用文件夹导入功能扩展您的桌面应用程序(通常通过 USB 插入手机,浏览到文件夹,导入)。 当您执行此过程时,让它通知某种网络服务(推送通知?我不是电话应用程序开发人员。)桌面应用程序从哪个设备(ids,文件名,...)和电话导入了哪些文件获取此元数据并可以继续它正在做的任何事情!

    显然,最好的解决方案是通过 USB 建立通信通道。在你弄清楚那个之前,你可以通过这种方式暂时实现它!

    【讨论】:

    • 我有一个 WebSockets 服务器,可用于在设备之间交换小块信息,因此我可以共享元数据。假设我这样做。如何在不打开资源管理器窗口的情况下以编程方式导航到共享目录(有问题的解决方案,如我的 OP 中所述)?似乎没有办法做到这一点。
    • 如何导航到共享目录是什么意思?我认为你让这比它更复杂......只需使用文件/文件夹选择对话框或实现(windows-)事件侦听器来连接设备并做出适当的反应!
    • 我刚试过:puu.sh/AZsrN/c74f67fe43.png 上面是文件夹选择对话框。下面是 Windows 资源管理器窗口。您可以看到文件夹选择对话框实际上没有电话在其列表中,就像资源管理器一样。不幸的是,没有办法实施您的解决方案。
    • 好吧,即使它不是文件系统的一部分,它也是通过窗口进行交互的,因此很难将其与 USB 存储设备区分开来。换句话说,Windows 成功实现了这一目标。 Windows 为您提供 API 来做同样的事情,因此我确信这是可能的,只是需要更多的研究!我去看看能不能找到什么!
    • 好的,看看这个,也许对你有用:stackoverflow.com/questions/8072650/… 编辑:做这个简单的事情似乎确实是个大问题。 URL 中的线程链接到这个库:forum.xda-developers.com/showthread.php?t=1512685
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多