Ubuntu上使用MTP传输文件

MTP是什么

媒体传输协议是一个基于图片传输协议(PTP,Picture Transfer Protocol)的自定义扩展协议。媒体传输协议(即通常所说的MTP,英语:Media Transfer Protocol,缩写:MTP)是“Windows Media”框架的一部分,与Windows Media Player密切相关,该协议允许用户在移动设备上线性访问媒体文件。不同的应用系统需要下载不同的媒体软件包才能够支持MTP的执行。

这里主要是探讨一下利用它在PC和Android设备间传输文件。

在Ubuntu上如何通过MTP传输文件

至少在Android 5.1以后,MTP、PTP与仅限充电功能,基本上是各种Android手机标配的USB功能,其中,PTP仅能传输照片,如果要传输其它文件,通常要使用MTP。在Windows 7以后,MTP已经被Windows系统默认支持,Android手机连接到Windows系统上直接可用。而Ubuntu则经历了好几种情况:

  • 在14.04上,通过gmtp、jmtpfs或mtpfs提供支持
  • 在16.04上,通过gmtp、go-mtpfs、jmtpfs或mtpfs提供支持
  • 在18.04上,通过gmtp、go-mtpfs、jmtpfs提供支持
  • 在20.04上,通过gmtp、go-mtpfs、jmtpfs、android-file-transfer提供支持

本文是基于20.04的android-file-transfer来说明的,尽管这个软件在以前的Ubuntu发行版上并没有包含在Ubuntu官方源中,但可以通过这一软件的官方网站下载到。

安装android-file-transfer

1
sudo apt install android-file-transfer

使用android-file-transfer

将Android设备连接到安装有Ubuntu 20.04的PC上,并在设备上将USB功能切换为传输文件模式。然后在Ubuntu的终端里面执行:

1
sudo aft-mtp-cli

程序首先会提示当前选择了哪个存储,这是相对于设备同时存在内置存储和SD卡来说的,但如果同时插入多个不同的设备,则只能使用其中一个。接下来,会输出程序版本和设备信息后进入到交互提示符,在提示符里输入help可以看到所有的命令,常用的有:

  • storage-list:列出当前有哪些MTP存储设备
  • storage <设备名>:切换到指定的MTP存储设备,设备名是storage-list列出的每一行的最后一个字段
  • ls [MTP path]:列出MTP存储设备当前所在路径或指定路径下的文件
  • cd <MTP path>:切换到MTP存储设备中指定路径
  • pwd:输出MTP存储设备当前所在路径
  • put <PC file> [MTP path]:从PC上复制一个文件到MTP存储设备当前路径或指定路径,注意:不会把文件路径名中的~解释为HOME目录,这里<PC file>[MTP path]都可以使用绝对或相对路径
  • get <MTP file> <PC path>:从MTP存储设备复制一个文件到PC上,路径的用法同put
  • exit:退出程序,quit命令也是一样的效果

有时候,只是想简单传输个文件,并不想进入到交互模式去执行这么一堆操作,这也是可以做到的,通过给aft-mtp-cli指定一个命令字符串就行了,示例:

1
sudo aft-mtp-cli "put work/app-debug.apk /Download/demo.apk"

上述命令将PC上的work/app-debug.apk复制到MTP存储设备,路径为/Download,并重命名为demo.apk了。

甚至,可以将命令列表写在一个文件中,然后通过-b -f来指定此文件以进行批量执行,例如,文件cmds.txt包含如下内容:

1
2
put work/app-debug.apk /Download/demo.apk
ls /Download/

那么,aft-mtp-cli -b -f cmds.txt将先把PC上的work/app-debug.apk上传到MTP存储设备的/Download目录下,命名为demo.apk后,再列出MTP存储设备的/Download目录。

注意事项

在上面的操作中,每一条命令都添加了sudo前缀,这主要是由于系统限制了普通用户对USB设备的访问,为了方便起见,可以添加相应的udev规则,按如下步骤操作即可:

  1. 安装适用于 Android 设备并由社区维护的默认udev规则

sudo apt install android-sdk-platform-tools-common

  1. 查看你所使用设备的厂商ID和产品ID并记下
1
2
$ lsusb
Bus 001 Device 006: ID 19d2:ffcf ZTE WCDMA Technologies MSM Android
  1. 编辑/lib/udev/rules.d/51-android.rules,并复制其中一条只匹配厂商ID的,将其厂商改掉即可,最好不要使用带产品ID,因为有时候可能匹配不上,据说是因为大小写区别导致,未经证实。示例如下:
1
SUBSYSTEM=="usb", ATTR{idVendor}=="19d2", ENV{adb_user}="yes"
  1. 重启udev
1
sudo systemctl restart udev

然后就可以直接使用aft-mtp-cli而无需加sudo前缀了。

android-file-transfer提供了一个简单的UI,如果要使用图形界面,直接使用安装时生成的桌面图标或运行android-file-transfer

参考资料