让支持MTP的设备与Ubuntu一起使用?

由于Ubuntu 13.04通过MTP对外部设备的存储访问应该通过GVFS-MTP模块开箱即用。

虽然这个问题与Galaxy Nexus有关, 但也支持其他Android设备以及支持Windows Phone和MTP的媒体播放

有关故障排除,请参阅此anwser 。


我在使用Galaxy Nexus通过MTP进行文件传输时遇到了很多问题。 我正在使用Kubuntu 11.10 64位,这就是我所做的和我得到的结果:

  1. /etc/udev/rules.d/51-android.rules添加了设备规则。 规则如下,适用于adb

     SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860", MODE="0666", OWNER="leob" #Galaxy Nexus 
  2. 重启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-folders而没有重新插入设备,我得到以下输出:

 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模式。 再次,阅读工作正常,但我不能写任何东西到设备。

从Ubuntu 13.04开始,通过MTP对外部设备的存储访问通过GVFS-MTP模块开箱即用。

相关问题: 有没有计划在未来的Ubuntu版本上改进mtp支持?

有关故障排除,请参阅此答案 。


对我来说,问题是我的系统上没有最新的libmtp文件。 所以我解决了这个问题并写了这篇文章来帮助别人 。

链接摘要:与旧的Ubuntu版本捆绑在一起的libmtp存在一个错误。 这个错误已在最新的libmtp 源中libmtp

你有没有尝试过Bilal Akhtar在omgubuntu 的建议?

使用MTPFS将您的Android手机或平板电脑连接到Ubuntu

  1. 建立

    首先,使用sudo apt-get install mtp-tools mtpfs

    将Galaxy Nexus连接到您的计算机。 在手机上,打开通知抽屉,然后单击“USB连接类型”。 确保选择了MTP。

    图像显示Android USB连接设置

    然后,运行以下命令:

     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替换为您之前记下的VENDORID 。 同样,将PRODUCTID替换为您记下的idProduct 。 就我而言,他们分别是04e8685c ,但他们可能会有所不同。

    保存并关闭文件。 然后, 断开手机并运行以下命令:

     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开头的#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 
  2. 用法

    连接手机,确保手机正在使用MTP并运行android-connect

    瞧! 您现在可以使用Nautilus浏览您的Android手机内容。 只需启动文件管理器,然后在侧栏中单击GalaxyNexus即可浏览手机内容,就像使用USB记忆棒一样。 您也可以像普通文件系统一样添加,删除和修改文件。

    nautilus显示手机内容的屏幕截图

    要安全地删除手机,只需运行android-disconnect

  3. 结论

    从现在开始,你只需要运行android-connect来安装你的手机然后android-disconnect来安全地删除你的手机。 其他一切都应该自动处理。 我尝试了许多方法来使安装和卸载在电缆连接上自动发生,但这是我能想到的最佳解决方案。

    这两个命令不需要root权限即可运行。 作为fuse用户组成员的所有用户都应该能够在没有root访问权限的情况下运行这些命令。

    而已! 您已成功将Ice Cream Sandwich手机连接到Ubuntu电脑。 对于一个新手来说,这个过程可能很长,但我相信有人会来为所有这些做一个GUI,以便一切顺利进行。 🙂

通过MTP与GVFS连接设备

由于Ubuntu 13.04存储访问支持MTP的设备通过GVFS后端开箱即用 。 请看看有没有计划在未来的Ubuntu版本上改进mtp支持? 有关13.04之前的安装说明。

此解决方案适用于所有提供MTPfunction的Android设备 ,可能适用于所有具有MTPfunction的非Android设备,如Windows PhonePortable Media Players

不要混淆

有一些混乱,让我们试着清理一下:

  • 您不需要做任何可能使保修失效的事情!

    • 您无需root设备。
    • 您无需解锁引导加载程序。 (您可以在Android上找到Android的说明。)

    解锁只是指这个答案中的操作系统锁屏。

  • 您无需通过某些udev规则配置开发人员对设备的访问权限,如ADB,fastboot或类似的东西。 (您可以在“ 配置USB访问她或她的电子邮件”一章中找到有关Android的说明。)

  • 据我所知,您也不需要FUSE或配置与FUSE相关的选项。

疑难解答问题

  1. 我无法将文件放到设备上。

    必须解锁您的设备才能通过MTP使用Ubuntu访问设备的存储。

    在nautilus中显示处于锁定和解锁状态的设备

  2. 我收到一条错误消息,指出无法安装该设备。

    如果您收到以下错误消息,请尝试重新插入设备一次

    连接时可能弹出的错误消息

    如果再次出现错误消息,请从启动器打开一个新的nautilus窗口(最好通过单击设备的图标),然后关闭当前的nautilus窗口。 可能相关: 如何创建一个udev规则来禁用其中一个Android设备?

  3. 检查您的设备是否有udev规则

    打开终端并输入lsusb 。 在输出中找到您的设备并记下ID(例如0fce:01b1 )。 第一部分是供应商ID,产品ID的最后一部分。

    使用nano /lib/udev/rules.d/69-libmtp.rules打开相应的mtp udev规则文件,然后搜索产品ID(使用Ctrl + W )。 如果找不到,则必须/etc/udev/rules.d/69-libmtp.rules以下模式在/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-common ) 提交错误 ,以便将您的设备包含在未来版本中(如果这对您有用 )。

  4. 我仍然无法连接

    底层libmtp不支持您的设备,或者您可能遇到与Lumia 620相同的问题,请按照我在LP#1247572中发布的解决方法(重现步骤) :诺基亚Lumia 620(WP8)无法可靠地安装通过nautilus中的gvfs-mtp 。 (这里的设备仍然无法正常工作,但使用mtp-detect帮助。)

    您应该搜索设备的libmtp错误跟踪器 ,并按照项目页面上新设备的说明打开错误报告。

  5. 错误跟踪器将我的设备列为支持,但仍然无效

    在某些情况下,有关您设备的错误报告可能已经在最新的libmtp版本中提交并解决,而不是您的发行版附带的版本(例如: Motorola Moto G )。 如果是这种情况,您将不得不等待官方存储库更新或寻找更新的PPA。

    可以在此处找到通过官方Ubuntu软件渠道和私有PPA提供的所有libmtp版本的更新列表(确保在不受信任的存档中展开“libmtp”的其他版本 )。 截至2014/02/13,Matthieu Baerts提供的这个PPA为Ubuntu提供了最新的libmtp软件包。

    警告 :此PPA包含各种不同且可能不稳定的包。 我建议不要将它添加到您的系统中。 相反,您可以单独下载libmtp软件包并在系统上手动安装它们。

    在进一步了解之前,请熟悉PPA及其风险 。 在继续执行以下步骤之前,请阅读以下有关恢复原始包的段落:

    1. 前往PPA的包详细信息页面并展开libmtp条目
    2. 下载以下软件包: libmtp-commonlibmtp-runtimelibmtp9mtp-tools 。 确保为您的系统选择正确的架构(通常是amd64 )。

      以下是截至2014/02/13的软件包链接: libmtp-common , libmtp-runtime , libmtp9 , mtp-tools

    3. 继续使用dpkg手动安装更新的软件包(将$HOME/Downloads更改$HOME/Downloads下载文件夹,并确保不存在其他deb文件:

       cd "$HOME/Downloads" sudo dpkg -i *.deb 
    4. 一切安装成功后,重新启动计算机,解锁Android设备,通过USB连接,它应显示在文件管理器中。

    这对我(@Glutanimate)和我的摩托罗拉Moto G工作得很好。因为我运行Ubuntu 12.04 LTS我首先必须安装gnome-gvfs的更新版本。 有关详细信息,请参阅顶部13.04之前的安装说明

    要在出现问题时撤消更改,或者仍然无法识别设备,则必须手动安装原始软件包。 前往libmtp源概述并找到您的Ubuntu版本。 展开相关条目并继续下载软件包,就像之前在步骤2中所做的那样。 按步骤3所述继续安装并重新启动系统。 现在一切都应该恢复正常了。

基于libmtp所有程序似乎仍然存在Galaxy Nexus的问题(从libmtp 1.1.3开始)。 基于gphoto2程序适合我。

就个人而言,我正在使用gphotofs包中的gphotofs

使用gphotofs ~/mymountpoint挂载,然后在完成后使用fusermount -u ~/mymountpoint卸载。

安装以下并重新启动:

 sudo apt-get install gvfs-backends mtpfs jmtpfs libmtp-common mtp-tools libmtp-dev libmtp-runtime libmtp9 gmtp libdbus-cpp5 libgflags2v5 libgoogle-glog0v5 libmtp-dbg libmtp-doc libmtpserver-dev libmtpserver1 libprocess-cpp3 mtp-server 

作为第一步,我将安装jmtpfs (终端中的sudo apt-get install jmtpfsCtrl + Alt + T ),然后使用mkdir foldername创建一个文件夹,然后使用jmtpfs foldername挂载设备,然后转到nautilus(Files)。

如果您的设备与ubuntu中的libmtp版本不兼容。 您必须下载并构建最近的libmtp (> 1.1.12),如下所示: 如何安装最新版本的libmtp?

您应该能够在终端中使用mtp-folders或使用图形界面gmtp查看文件夹。

如果您在没有sudo情况下运行它们,之前的步骤可能会显示错

 libusb_open() failed!: Permission denied 

要避免使用sudo,您应该将设备添加到上面的/etc/udev/rules.d/51-android.rules文件中并重新加载规则或重新启动。

只需一个小的解决方法,将基于ICS的手机连接到良好的旧版MASS STORAGE http://forum.xda-developers.com/showthread.php?t=1556367

 adb install UMS1.0.apk