跳转到内容

媒体传输协议

来自 Arch Linux 中文维基

媒体传输协议(Media Transfer Protocol MTP)可用于在移动设备(所有的 Windows Phone 7/8/10 设备,大部分新的 Android 设备)以及媒体播放器(如 Creative Zen)之间传输媒体文件。

连接[编辑 | 编辑源代码]

要通过 MTP 将计算机连接至一台设备:

  • 该设备需要通过 USB 连接至计算机
  • 需要启用设备上的 MTP
  • 设备需要解锁屏幕(安全原因)

FUSE 文件系统[编辑 | 编辑源代码]

下列程序允许通过 FUSE 文件系统访问 MTP 设备。

注意:MTP 功能杂乱且设备之间的实现各不相同。请尝试以下客户端,找出最合适的那一款。
提示:建议在安装 MTP 相关软件包后重启计算机。

对基于 FUSE 的文件系统,可能需要先创建挂载点目录。以下示例中使用了 ~/mnt 目录。

挂载的 FUSE 一般可用 fusermount -u mountpoint 卸载。

Android File Transfer[编辑 | 编辑源代码]

Android File Transfer — 带有 CLI、Qt 界面 和 FUSE 封装器的 MTP 客户端,使用自定义 MTP 实现。

https://whoozle.github.io/android-file-transfer-linux/ || android-file-transfer

将设备挂载至 ~/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 设备。

https://www.adebenham.com/mtpfs/ || mtpfs
注意:以下操作可能无效,需要恢复至 libgphoto2 或使用支持 gvfs 的文件管理器,例如 PCManFM

首先编辑 /etc/fuse.conf,取消该行的注释:

user_allow_other

然后将设备挂载至 ~/mnt

$ mtpfs -o allow_other ~/mnt

jmtpfs[编辑 | 编辑源代码]

jmtpfs — 基于 libmtp,用于访问 MTP(Media Transfer Protocol)设备。

https://github.com/JasonFerrara/jmtpfs || jmtpfsAUR

将设备挂载至 ~/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 设备上的文件进行操作。

https://github.com/phatina/simple-mtpfs/ || simple-mtpfsAUR

运行 simple-mtpfs -l 以列出探测到的设备。

要将列表中的第一个设备挂载至 ~/mnt,请运行 simple-mtpfs --device 1 ~/mnt

go-mtpfs[编辑 | 编辑源代码]

go-mtpfs — 使用自定义 MTP 实现的 FUSE 文件系统,用 Go 语言编写。

https://github.com/hanwen/go-mtpfs || go-mtpfs-gitAUR

安装 android-udev,之后可编辑 /etc/udev/rules.d/51-android.rules 并应用至 idVendoridProduct,运行 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 列出)。

安装 libmtp 软件包。

运行 mtp-detect 以探测设备。

若返回错误,请确认当前用户在 adbusers 用户组内。

可使用 mtp-connect 命令传输文件。

前端[编辑 | 编辑源代码]

gMTP — libmtp 的一个图形前端。允许用户连接安卓设备,并使用与桌面无关的图形用户界面管理文件。

https://gmtp.sourceforge.io/ || gmtp

媒体播放器[编辑 | 编辑源代码]

要在音乐播放器(如 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英语gvfs 的文件管理器能够显示并挂载 MTP 设备。若不受支持且无法打开,请在手机上更改至 PTP 并安装 gvfs-gphoto2 以获取(至少)对照片的访问,通过命令行挂载 PTP 与挂载 MTP 设备类似:gio mount gphoto2://[usb:002,019]/

注意:若访问设备受限,且无法通过命令行使用标准命令,例如 cpls,请查找 gvfs英语gvfs 的自身替代品:ls -1 /usr/bin/gvfs-*

故障排除[编辑 | 编辑源代码]

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)访问不同型号手机的文件。对于至少一位用户,解决方案是将其关闭。