自从Ubuntu 13.04通过外部设备进行存储访问中期计划应该开箱即用通过 GVFS-MTP 模块。
虽然这个问题是关于 Galaxy Nexus 的,但其他 Android 设备以及Windows 手机以及支持MTP的媒体播放器也支持。
为了故障排除看这个答案。
我在 Galaxy Nexus 上通过 MTP 进行文件传输时遇到了很多问题。我使用的是 Kubuntu 11.10 64 位,这是我所做的以及得到的结果:
为 中的设备添加了规则
/etc/udev/rules.d/51-android.rules
。规则如下,适用于adb
:SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860", MODE="0666", OWNER="leob" #Galaxy Nexus
重新启动
udev
(并重新启动计算机以确保无误)。
Adb 可以工作,并且所有通过 MTP 从设备读取的方法似乎都可以工作(我尝试使用 mtpfs、gmtp 进行安装,并直接使用 mtp-tools 包)。但是,当我尝试写入设备时,我尝试过的所有方法都不起作用。
例如,运行mtp-newfolder test_dir 0 0
将得到以下输出:
libmtp version: 1.1.0
Device 0 (VID=04e8 and PID=6860) is a Samsung GT-P7510/Galaxy Tab 10.1.
Folder creation failed.
ERROR: Could not close session!
如果我mtp-folders
在 mtp-newfolder 失败后运行而不重新插入设备,我会得到以下输出:
Attempting to connect device(s)
Device 0 (VID=04e8 and PID=6860) is a Samsung GT-P7510/Galaxy Tab 10.1.
PTP_ERROR_IO: failed to open session, trying again after resetting USB interface
LIBMTP libusb: Attempt to reset device
mtp-folders: Successfully connected
Friendly name: (NULL)
Error 1: Get Storage information failed.
Error 2: PTP Layer error 02fe: get_all_metadata_fast(): could not get proplist of all objects.
Error 2: (Look this up in ptp.h for an explanation.)
Error 2: PTP Layer error 02fe: get_handles_recursively(): could not get object handles.
Error 2: (Look this up in ptp.h for an explanation.)
LIBMTP_Get_Storage()
: Resource temporarily unavailable
OK.
在dmesg中伴随以下内容:
[ 1000.912082] usb 2-4: reset high speed USB device number 7 using ehci_hcd
[ 1001.045877] usb 2-4: usbfs: process 3166 (mtp-folders) did not claim interface 0 before use
有人知道该怎么办吗?
编辑:
我也尝试了 PTP 模式。同样,读取工作正常,但我无法将任何内容写入设备。
答案1
自 Ubuntu 13.04 起,通过 MTP 对外部设备的存储访问可通过 GVFS-MTP 模块实现。
相关问题:是否有计划在未来的 Ubuntu 版本中改进 mtp 支持?
如需故障排除,请参阅这个答案。
对我来说,这是由于我的系统上没有最新libmtp
文件的问题。所以我修复了这个问题,并这篇文章是为了帮助别人。
链接摘要:旧版 Ubuntu 捆绑包中有一个错误libmtp
。此错误已在最新来源的libmtp
。
答案2
使用 MTPFS 将你的 Android 手机或平板电脑连接到 Ubuntu
设置
首先,安装必要的工具
sudo apt-get install mtp-tools mtpfs
将 Galaxy Nexus 连接到电脑。在手机上,打开通知抽屉,点击“USB 连接类型”。确保已选择 MTP。
然后运行以下命令:
mtp-detect | grep idVendor mtp-detect | grep idProduct
你将得到如下输出:
现在,运行以下命令:
gksu gedit /etc/udev/rules.d/51-android.rules
应会打开一个 Gedit 窗口。在其中输入以下文本,全部以单线:
SUBSYSTEM=="usb", ATTR{idVendor}=="VENDORID", ATTR{idProduct}=="PRODUCTID", MODE="0666"
VENDORID
用idVendor
你之前记下的替换。同样,用你之前记下PRODUCTID
的替换idProduct
。在我的情况下,它们分别是04e8
和685c
,但对你来说可能有所不同。保存并关闭文件。然后,断开你的手机并运行以下命令:
sudo service udev restart sudo mkdir /media/GalaxyNexus sudo chmod a+rwx /media/GalaxyNexus sudo adduser $USER fuse
$USER
是默认的 shell 变量,应该是您要添加的用户(通常是您自己)。现在,运行以下命令:gksu gedit /etc/fuse.conf
在 Gedit 窗口中,删除
#
最后一行(以 开头的行#user_allow_other
)开头的 ,如下所示:您快完成了!现在,重新启动计算机,然后运行以下三个命令:
echo "alias android-connect=\"mtpfs -o allow_other /media/GalaxyNexus\"" >> ~/.bashrc echo "alias android-disconnect=\"fusermount -u /media/GalaxyNexus\"" >> ~/.bashrc source ~/.bashrc
用法
连接您的手机,确保您的手机正在使用 MTP 并运行
android-connect
。瞧!现在您可以使用 Nautilus 浏览 Android 手机内容。只需启动文件管理器,然后在侧栏中单击 GalaxyNexus 即可浏览手机内容,就像使用 USB 记忆棒一样。您还可以像普通文件系统一样添加、删除和修改文件。
要安全地移除手机,只需运行
android-disconnect
。结论
从现在开始,你只需要运行
android-connect
安装手机,然后android-disconnect
安全地移除手机。其他一切都应该自动处理。我尝试了很多方法让安装和卸载在有线连接时自动进行,但这是我能想到的最佳解决方案。这两个命令不需要 root 权限运行。所有属于 fuse 用户组的用户都应该能够在没有 root 访问权限的情况下运行这些命令。
就这样!您已成功将 Ice Cream Sandwich 手机连接到 Ubuntu 计算机。对于新手来说,这个过程可能很长,但我相信有人会来为这一切制作一个 GUI,以便一切顺利进行。:)
答案3
通过 MTP 与 GVFS 连接设备
自 Ubuntu 13.04 开始,通过垂直起降系统后端。请查看是否有计划在未来的 Ubuntu 版本中改进 mtp 支持?13.04 之前的安装说明。
此解决方案应该适用于所有 Android 设备提供 MTP 功能,并且可能所有非 Android 设备都具有 MTP 功能,例如Windows 手机和便携式媒体播放器。
不要困惑
有一些混乱,让我们试着澄清一下:
你不需要做任何可能使您的保修失效的事情!
您不需要 root 您的设备。
您无需解锁引导加载程序。(您可以在此处找到有关 Android 的说明埃。
在本答案中,解锁仅指操作系统锁屏。
您无需通过某些 udev 规则配置开发人员对设备的访问权限,如 ADB、fastboot 或类似功能。(您可以在第章中找到有关 Android 的说明配置 USB 访问 这里或者这里。
据我所知,您也不需要 FUSE 或配置与 FUSE 相关的选项。
故障排除问题
我无法将文件放入该设备。
您的设备必须解锁通过 MTP 使用 Ubuntu 访问设备的存储。
我收到一条错误消息,提示无法安装该设备。
如果收到以下错误消息,请尝试重新插入设备一次。
如果再次出现错误消息,请从启动器打开一个新的 nautilus 窗口(最好单击设备图标),并可能关闭当前的 nautilus 窗口。可能相关:如何创建 udev 规则来禁用某个 Android 设备?
检查你的设备是否有 udev 规则
打开终端并输入
lsusb
。在输出中找到您的设备并记下 ID(例如0fce:01b1
)。第一部分是供应商 ID,最后一部分是产品 ID。打开相应的 mtp udev 规则文件
nano /lib/udev/rules.d/69-libmtp.rules
并搜索您的产品 ID(使用Ctrl+ W)。如果找不到,您必须按照/etc/udev/rules.d/69-libmtp.rules
以下模式创建自定义条目,然后重启。# SONY Xperia Z2 MTP ATTR{idVendor}=="01b1", ATTR{idProduct}=="01b1", SYMLINK+="libmtp-%k", MODE="660", GROUP="audio", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
你应该考虑提交错误反对这libmtp 包(更确切地说libmtp-通用),以便将您的设备包含在未来的版本中,如果这对您有用的话。
我仍然无法连接
您的设备可能不受底层支持
libmtp
,或者您可能遇到与我的 Lumia 620 相同的问题,请按照我在LP#1247572:诺基亚 Lumia 620 (WP8) 无法通过 nautilus 中的 gvfs-mtp 可靠挂载。(该设备在这里仍然不能完美运行,但使用mtp-detect
有帮助。)你应该搜索libmtp 错误追踪器并按照新设备的说明进行操作项目页面打开错误报告。
错误跟踪器将我的设备列为受支持,但它仍然无法工作
在某些情况下,与你的设备相关的错误报告可能已经在比你的发行版附带的版本更新的 libmtp 版本中提交并解决了(例如:摩托罗拉 Moto G)。如果是这种情况,您要么必须等待官方存储库更新,要么去寻找更新的 PPA。
可以通过官方 Ubuntu 软件渠道和私人 PPA 找到所有 libmtp 版本的更新列表这里(确保扩展不受信任的档案库中的其他“libmtp”版本). 截至2014/02/13此 PPAMatthieu Baerts 提供了适用于 Ubuntu 的最新 libmtp 包。
警告:此 PPA 包含各种不同且可能不稳定的软件包。我建议不要将其添加到您的系统中。相反,您可以单独下载 libmtp 软件包并手动将它们安装在您的系统上。
请熟悉购电协议及其风险在继续进行任何操作之前,请先阅读以下有关恢复原始软件包的段落,然后再继续以下步骤:
前往PPA 的软件包详细信息页面并展开 libmtp 条目
下载以下软件包:,,,,
libmtp-common
。确保为你的系统选择正确的架构(通常是)。libmtp-runtime
libmtp9
mtp-tools
amd64
以下是截至 2014/02/13 的软件包链接:libmtp-通用,libmtp 运行时,libmtp9,mtp 工具
继续使用 dpkg 手动安装更新的软件包(更改
$HOME/Downloads
到您的下载文件夹并确保没有其他 deb 文件存在:cd“$HOME/Downloads” sudo dpkg -i *.deb
一旦一切安装成功,请重新启动计算机,解锁您的 Android 设备,通过 USB 连接,它就会显示在您的文件管理器中。
这对我的摩托罗拉 Moto G 来说效果很好 (@Glutanimate)。因为我运行的是 Ubuntu 12.04 LTS,所以我首先必须安装更新版本
gnome-gvfs
。请参阅13.04 之前的安装说明位于顶部以获取更多信息。如果出现问题或设备仍无法识别,要撤消更改,您必须手动安装原始软件包。前往libmtp 源概述并找到您的 Ubuntu 版本。展开相关条目并继续下载软件包,就像您之前在步骤 2 中所做的那样。按照步骤 3 中的说明继续安装并重新启动系统。现在一切都应该恢复正常了。
答案4
安装以下内容并重新启动:
sudo apt update
sudo apt install android-tools-adb gvfs-backends go-mtpfs jmtpfs gmtp libgoogle-glog0v5 libmtp-common libmtp-dbg libmtp-dev libmtp-runtime libmtp9 gmtp jmtpfs mtp-tools python-pymtp