媒体传输协议
媒体传输协议(Media Transfer Protocol MTP)可用于在移动设备(所有的 Windows Phone 7/8/10 设备,大部分新的 Android 设备)以及媒体播放器(如 Creative Zen)之间传输媒体文件。
连接[编辑 | 编辑源代码]
要通过 MTP 将计算机连接至一台设备:
- 该设备需要通过 USB 连接至计算机
- 需要启用设备上的 MTP
- 设备需要解锁屏幕(安全原因)
FUSE 文件系统[编辑 | 编辑源代码]
下列程序允许通过 FUSE 文件系统访问 MTP 设备。
对基于 FUSE 的文件系统,可能需要先创建挂载点目录。以下示例中使用了 ~/mnt
目录。
挂载的 FUSE 一般可用 fusermount -u mountpoint
卸载。
Android File Transfer[编辑 | 编辑源代码]
Android File Transfer — 带有 CLI、Qt 界面 和 FUSE 封装器的 MTP 客户端,使用自定义 MTP 实现。
将设备挂载至 ~/mnt
:
$ aft-mtp-mount ~/mnt
若希望显示专辑封面,则必须将其命名为 albumart.xxx
并应先将其放入目标文件夹,然后再复制其他文件。同时请注意,fuse 可能比 ui 或 cli 的文件传输慢 7 至 8 倍。
若希望通过命令行接口与其交互,请运行命令:
$ aft-mtp-cli
输入 help 以列出所有可用命令,输入 exit 退出。
若希望通过图形用户界面与其交互,请启动 android-file-transfer 应用程序,选择一个目标文件夹并点击工具栏上的任意按钮。可用选项有:Upload Album(上传专辑)、Upload Directory(上传文件夹)和 Upload Files(上传文件)。后两项不必解释。Upload album 选项将在源目录内搜索并设置一个最佳的专辑封面。
MTPfs[编辑 | 编辑源代码]
MTPfs — 一个基于 libmtp 的 FUSE 文件系统,支持读写任意 MTP 设备。
首先编辑 /etc/fuse.conf
,取消该行的注释:
user_allow_other
然后将设备挂载至 ~/mnt
:
$ mtpfs -o allow_other ~/mnt
jmtpfs[编辑 | 编辑源代码]
jmtpfs — 基于 libmtp,用于访问 MTP(Media Transfer Protocol)设备。
将设备挂载至 ~/mnt
:
$ jmtpfs ~/mnt
通过以下两个步骤,使其与 Linux 的其他部分保持一致(使用通常的 mount 与 umount 命令):
$# ln -s <“实际的挂载命令路径”> <“与 Linux 挂载约定一致的名称“> $ ln -s /sbin/jmtpfs /sbin/mount.jmtpfs
将此行(非 # 注释的那一行)添加至 /etc/fstab
:
#jmtpfs <“挂载路径”> fuse nodev,allow_other,<“其他选项”> 0 0 jmtpfs /home/sam/run/motog fuse nodev,allow_other,rw,user,noauto,noatime,uid=1000,gid=1000 0 0
然后挂载设备,观察选项是否生效:
$ mount /home/sam/run/motog Device 0 (VID=22b8 and PID=2e82) is a Motorola Moto G (ID2). Android device detected, assigning default bug flags $ mount ... jmtpfs on /home/sam/run/motog type fuse.jmtpfs (rw,nosuid,nodev,noexec,noatime,user_id=1000,group_id=1000,allow_other,user=sam)
SIMPLE-MTPFS[编辑 | 编辑源代码]
SIMPLE-MTPFS — 简易媒体传输协议文件系统(Simple Media Transfer Protocol FileSystem),基于 libmtp,能够对通过 USB 连接至本地机器的 MTP 设备上的文件进行操作。
运行 simple-mtpfs -l
以列出探测到的设备。
要将列表中的第一个设备挂载至 ~/mnt
,请运行 simple-mtpfs --device 1 ~/mnt
。
go-mtpfs[编辑 | 编辑源代码]
go-mtpfs — 使用自定义 MTP 实现的 FUSE 文件系统,用 Go 语言编写。
安装 android-udev包,之后可编辑 /etc/udev/rules.d/51-android.rules
并应用至 idVendor
和 idProduct
,运行 mtp-detect 后可观察到上述行为。在行尾添加当前用户 OWNER="user"
。
将设备挂载至 ~/mnt
:
$ go-mtpfs ~/mnt
- 有多个设备时,可使用
-d
标志指定某个设备(id 可通过运行mtp-detect
获取)。 - 使用
go-mtpfs
挂载时,若存在外置 SD 卡,挂载可能会失败。若在有 SD 卡的情况下尝试访问设备时遇 go-mtpfs 报错,请移除 SD 卡并重新挂载。 - 该软件包自 2020 年以来未曾维护。
libmtp[编辑 | 编辑源代码]
libmtp 是一个 MTP 实现库,还附带了一些命令行工具示例(可使用 pacman -Ql libmtp
列出)。
运行 mtp-detect
以探测设备。
若返回错误,请确认当前用户在 adbusers
用户组内。
可使用 mtp-connect
命令传输文件。
前端[编辑 | 编辑源代码]
gMTP — libmtp 的一个图形前端。允许用户连接安卓设备,并使用与桌面无关的图形用户界面管理文件。
媒体播放器[编辑 | 编辑源代码]
要在音乐播放器(如 Amarok)中使用 MTP 设备,需编辑 /etc/udev/rules.d/51-android.rules
(以下示例中的 MTP 设备是一部 Galaxy Nexus)。运行如下命令以搜索设备:
$ lsusb
搜索结果应类似于:
Bus 003 Device 011: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone [Galaxy S II], GT-P7500 [Galaxy Tab 10.1]
将条目其添加至 /etc/udev/rules.d/51-android.rules
,像这样:
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0666", OWNER="[username]"
同时,重新加载 udev 规则:
# udevadm control --reload
文件管理器集成[编辑 | 编辑源代码]
要在文件管理器内通过 MTP 查看安卓设备的存储内容,请安装对应的插件:
- 对于使用 GVFS 的文件管理器(GNOME Files),安装 gvfs-mtp包 以支持 MTP 或安装 gvfs-gphoto2包 以支持 PTP。
- 对于使用 KIO 的文件管理器(KDE 的 Dolphin),kio-extras包(dolphin 的依赖项)已包含 MTP 支持。
安装好所需的软件包后,设备应自动显示在文件管理器内,并且可通过 URL 访问,如 mtp://[usb:002,013]/
。
gvfs-mtp[编辑 | 编辑源代码]
gvfs-mtp包 软件包可从官方仓库获取。
可通过 lsusb
获得设备信息,包括 Bus 编号、设备编号(Device numbers)和设备 ID,前两项信息可用于 gvfs-mtp
,设备 ID 可用于创建 udev 规则。
Bus 002 Device 018: ID 04b7:88a9 Compal Electronics, Inc.
要查看已探测到启用了 MTP 的设备,使用 gio mount:
gio mount -li | grep -e ^Volume -e activation_root
Volume(0): MT65xx Android Phone activation_root=mtp://[usb:002,018]/
或使用 lsusb:
lsusb -v 2> /dev/null | grep -e Bus -e iInterface -e bInterfaceProtocol
... Bus 002 Device 018: ID 04b7:88a9 Compal Electronics, Inc. bInterfaceProtocol 0 iInterface 5 MTP ...
要挂载所有可用的已连接 MTP 设备,请使用内联脚本:
gio mount -li | awk -F= '{if(index($2,"mtp") == 1)system("gio mount "$2)}'
通过命令使用 gvfs-mtp 挂载或卸载设备,请指定 Bus 编号和设备编号(Device numbers),例如,使用 gio mount mtp://[usb:001,007]/
挂载,使用 gio mount -u mtp://[usb:001,007]/
卸载。已挂载设备可通过 mtp:host= 开头的目录访问,且位于 /run/user/$UID/gvfs/ 目录下。
使用 gvfs 时,若希望禁用自动挂载 MTP 设备的功能,需更改 AutoMount 变量的值,将其从 true 更改为 false,该变量位于 /usr/share/gvfs/mounts/mtp.mount
。
若设备没有出现在文件管理器中,则可能缺少 #libmtp 的本地支持,或是不在支持的设备列表中。在尝试使用命令行挂载时,可能会遇到错误:
Device 0 (VID=XXXX and PID=XXXX) is UNKNOWN. Please report this VID/PID and the device model to the libmtp development team
使设备显示在文件管理器中的解决方法是,为设备写一个 udev 规则,但这并不保证能用 MTP 连接将其成功挂载。
创建一个 udev 规则配置文件并使用 vendorId:productID 模式的 ID 编号:
/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="04b7", ATTR{idProduct}=="88a9", MODE="0660", GROUP="uucp", ENV{ID_MTP_DEVICE}="1", SYMLINK+="libmtp"
然后重新加载 udev 规则:
# udevadm control --reload
若受 #libmtp 支持,支持 gvfs 的文件管理器能够显示并挂载 MTP 设备。若不受支持且无法打开,请在手机上更改至 PTP 并安装 gvfs-gphoto2包 以获取(至少)对照片的访问,通过命令行挂载 PTP 与挂载 MTP 设备类似:gio mount gphoto2://[usb:002,019]/
。
故障排除[编辑 | 编辑源代码]
libmtp(gvfs-mtp):使用文件管理器(nautilus、pcmanfm、vifm 等)访问安卓设备上的相机相册时挂起[编辑 | 编辑源代码]
症状:一切正常,直到进入相机相册目录。此时文件管理器冻结,甚至在命令行下也无法 ls
该目录。
这极有可能是 libmtp 的问题。
该症状可能由类似 20180915_180351(0).jpg
的文件名引起。例如,三星手机倾向于创建此类名称的文件。
参见相关问题报告([1]、[2])和问答([3]、[4])。
该问题可能的解决方法是使用与 #FUSE 文件系统不同的 mtp 选项(例如 go-mtpfs)或更改手机相机的文件命名策略(或切换至其他相机应用,如 Open Camera)。
jmtpfs:首次访问设备时出现输入输出错误[编辑 | 编辑源代码]
症状:jmtpfs 成功挂载,但当尝试访问设备上的文件时(例如,通过 ls
访问),会产生以下报错:
cannot access <mount-point>: Input/output error
这可能是一个安全特性:手机屏幕锁定时,MTP 不能正常运作。解锁手机后,只要保持连接,MTP 应正常生效。
kio-mtp: 无法使用“用文件管理器打开”操作[编辑 | 编辑源代码]
若无法使用“用文件管理器打开(Open with File Manager)”,可能需要编辑文件 /usr/share/solid/actions/solid_mtp.desktop
以解决此问题。
将 Exec=kioclient exec mtp:udi=%i/
这一行更改为 Exec=dolphin "mtp:/"
。
kio-mtp 被不同的服务同时调用[编辑 | 编辑源代码]
根据此帖内容,应避免同时使用 mtpfs 和 kio-mtp,或是使用与 kio-mtp 冲突的服务(包括音乐播放服务)。
例如,Amarok 的 MTP 服务插件,可能会阻止 Dolphin(plasma)访问不同型号手机的文件。对于至少一位用户,解决方案是将其关闭。