在 Android 和 Node.js 之间传输大文件

10

我有一个拍照Android应用程序(使用React Native编写,但如果需要,我可以添加本地模块),它与用户电脑上的画廊类型应用程序(使用Electron和React编写)配对。照片数量可能很大(我们一次有超过一千张照片),并且需要将它们传输到电脑应用程序中,未压缩且未裁剪。我需要一种可靠的方法在不通过互联网的情况下完成这一点。

我尝试过的事情

Node USB:看起来是一个不错的库,但是需要在用户电脑上安装驱动程序才能使用。然后,该驱动程序似乎会替换默认的Windows USB驱动程序,并且无法通过常规方式(在Windows中打开文件浏览器)访问手机。也许有某种方法可以“即时”切换驱动程序,在传输照片时仅使用驱动程序,然后在完成后切换回系统驱动程序?

ADB:这是我尝试的最初解决方案,它完全符合我的需求,但有两个致命问题:首先,手机需要启用开发人员模式;其次,ADB似乎不能识别所有设备(例如,我们在使用LG V20时遇到了很多麻烦)。对于这个问题的理想答案将是像ADB一样,但没有这两个问题。

WiFi路由:我们将手机连接到与主机计算机相同的WiFi网络,使用WebSockets通过互联网进行IP握手,然后通过WiFi网络启动直接连接。如果找不到其他解决方案,这可能会成为我采用的方法。此选项的最大问题是需要相对大量的手动设置。我们的用户往往不太精通技术,而且我不知道假设他们在家里有WiFi是否合理。无论如何,这不能是传输的唯一选择。此外,通过无线网络传输几GB的照片会导致同一网络上的所有人都变慢。

手机共享网络: 我们将手机与电脑通过数据线连接,以类似于上一步骤的方式建立直接连接。这种方法的缺点是只有带有SIM卡的手机可以激活网络共享功能(并非我们所需的所有手机都带有SIM卡,因为它们的主要用途不是连接性),此外所有其他流量都会通过手机路由,对于有SIM卡的客户的数据限制会产生负面影响。此外,没有编程方式可以打开网络共享,只能通过菜单手动操作;虽然这不是太大的问题,但前两个缺点是非常明显的。

蓝牙: 通常符合我的需求,但是数据传输速率远低于WiFi,比WiFi低一级。

WiFi Direct: 我实际上没有尝试过这个方法,因为我找不到一种可行的方法让电脑接受WiFi Direct连接。它承诺了出色的速度,但我没有找到任何模块或库来帮助我启用它。

SD卡: 最低端的技术方法,只需将所有内容保存到SD卡中,然后让客户将卡插入其计算机。除了需要一个SD卡插槽(客户的计算机或手机都不能保证有),否则它是最好的选择。

显而易见的方法: 手动拖放需要从手机到电脑的文件。这是我们现在所做的,但它存在很多问题。在传输过程中,文本文件会被截断最后15-20个字符,原因未知;由于MTP不会强制在手机上重新扫描媒体,因此设备上的许多照片最初不会显示出来;有时用户会将文件放错位置,导致不必要的技术支持电话。这种方法肯定需要被替换。
我已经寻找了两个月的解决方案,这个问题很难相信没有人像我一样使用Android。我们可以开发一些程序实现Android与PC之间的USB通信,Windows就是一个开始。然而,尽管我尝试了很多,却没有找到可以直接使用的解决方案。有人遇到过类似的问题吗?你们的解决方案是什么?你们如何解决这个问题?
2个回答

3

在安卓上下载大文件时,建议使用下载管理器。它支持许多本地特性(例如进度条和通知),同时下载任务将由操作系统处理,更加高效。

React Native Fetch Blob库支持此功能。


我的OP规定照片不能先通过互联网路由,必须进行本地传输。最多可能有一千兆字节的照片,这对于有数据限制的客户来说是大量的数据。是否有办法在本地使用React Native Fetch Blob? - sg.cc

0

你其实不需要通过互联网路由数据。你可以只通过互联网交换元数据:通过文件夹导入功能扩展你的桌面应用程序(通过USB正常连接手机,浏览到文件夹,导入)。当你执行此过程时,让它通知某种类型的Web服务(推送通知?我不是手机应用程序开发者),桌面应用程序已从哪个设备导入了哪些文件(ID、文件名等),手机获取这些元数据并可以继续进行其正在进行的任何过程!

显然,最好的解决方案是通过USB进行通信。在你找到那个解决方案之前,你可以暂时以这种方式实现!


我刚刚尝试了一下:http://puu.sh/AZsrN/c74f67fe43.png 上面是文件夹选择对话框。下面是Windows资源管理器窗口。您可以看到,文件夹选择对话框实际上没有像资源管理器那样将手机列出。不幸的是,无法实现您的解决方案。 - sg.cc
1
即使它不是文件系统的一部分,它仍通过窗口进行接口处理,这使得它很难与USB存储设备区分开来。换句话说,Windows成功地做到了这一点。而且,Windows提供了API供您执行相同的操作,因此我确定这是可能的,只需要更多的研究!我会尽力查找并看看能否找到相关的内容! - Aphton
事实上,它在Windows上是可能的这一点给了我希望,这也是我在这里发布的原因。不过,我必须承认,这非常令人绝望。我尝试了很多不同的方法,但都没有成功,我在我的OP中提到的那些只是我最好的线索。 - sg.cc
1
好的,请看一下,也许对您有用: https://stackoverflow.com/questions/8072650/programmatically-access-files-on-android-device-from-pc编辑:这似乎是做这件简单事情的一个很大的问题。该URL中的线程链接到此库:https://forum.xda-developers.com/showthread.php?t=1512685 - Aphton
我也发现智能手机被注册为“可携式设备”,需要通过WPD (Windows Portable Device) API查询(请参阅:https://learn.microsoft.com/en-us/windows/desktop/wpd_sdk/programming-reference)以下是可用于查询连接的便携设备的COM接口:https://learn.microsoft.com/en-us/windows/desktop/api/PortableDeviceApi/nn-portabledeviceapi-iportabledevicemanager不确定Electron/React是否容易实现,我不懂这种语言。在C++中,这只是一个短小的方法!编辑:抱歉我无法做出更多贡献。祝你好运! - Aphton
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接