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上,路径的用法同putexit
:退出程序,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 | put work/app-debug.apk /Download/demo.apk |
那么,aft-mtp-cli -b -f cmds.txt
将先把PC上的work/app-debug.apk
上传到MTP存储设备的/Download
目录下,命名为demo.apk
后,再列出MTP存储设备的/Download
目录。
注意事项
在上面的操作中,每一条命令都添加了sudo
前缀,这主要是由于系统限制了普通用户对USB设备的访问,为了方便起见,可以添加相应的udev规则,按如下步骤操作即可:
- 安装适用于 Android 设备并由社区维护的默认udev规则
sudo apt install android-sdk-platform-tools-common
- 查看你所使用设备的厂商ID和产品ID并记下
1 | $ lsusb |
- 编辑/lib/udev/rules.d/51-android.rules,并复制其中一条只匹配厂商ID的,将其厂商改掉即可,最好不要使用带产品ID,因为有时候可能匹配不上,据说是因为大小写区别导致,未经证实。示例如下:
1 | SUBSYSTEM=="usb", ATTR{idVendor}=="19d2", ENV{adb_user}="yes" |
- 重启udev
1 | sudo systemctl restart udev |
然后就可以直接使用aft-mtp-cli而无需加sudo前缀了。
android-file-transfer
提供了一个简单的UI,如果要使用图形界面,直接使用安装时生成的桌面图标或运行android-file-transfer
。