让支持 MTP 的设备与 Ubuntu 一起工作?

Leo*_*Leo 70 mtp

由于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
    
    Run Code Online (Sandbox Code Playgroud)
  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!
Run Code Online (Sandbox Code Playgroud)

如果我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.
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

有没有人知道该怎么做?

编辑:

我也试过PTP模式。同样,读取工作正常,但我无法向设备写入任何内容。

小智 38

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

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

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


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

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

  • 尝试访问 nexus 时,rhythmbox 仍然冻结并给出错误(LIBMTP_Send_Representative_Sample():无法获取对象信息。),而 nautilus 给出:无法安装 Galaxy Nexus;初始化相机时出错:-60:无法锁定设备。便便。 (2认同)

des*_*gua 22

您是否在omgubuntu尝试过Bilal Akhtar 的建议?

使用 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
    
    Run Code Online (Sandbox Code Playgroud)

    你会得到这样的输出: 在此处输入图片说明

    现在,运行这些命令:

    gksu gedit /etc/udev/rules.d/51-android.rules
    
    Run Code Online (Sandbox Code Playgroud)

    Gedit 窗口应该打开。在其中输入此文本,全部在一行中

    SUBSYSTEM=="usb", ATTR{idVendor}=="VENDORID", ATTR{idProduct}=="PRODUCTID", MODE="0666"
    
    Run Code Online (Sandbox Code Playgroud)

    替换VENDORIDidVendor您之前记下的。同样,替换PRODUCTIDidProduct您记下的。就我而言,它们分别是04e8685c,但它们对您来说可能有所不同。

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

    sudo service udev restart
    sudo mkdir /media/GalaxyNexus
    sudo chmod a+rwx /media/GalaxyNexus
    sudo adduser $USER fuse
    
    Run Code Online (Sandbox Code Playgroud)

    $USER是默认的 shell 变量,应该是您要添加的用户(通常是您自己)。现在,运行此命令:

    gksu gedit /etc/fuse.conf
    
    Run Code Online (Sandbox Code Playgroud)

    在 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用法

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

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

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

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

  3. 结论

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

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

    就是这样!您已成功将 Ice Cream Sandwich 手机连接到 Ubuntu 计算机。对于新手来说,这个过程可能很长,但我相信有人会过来为所有这些制作一个 GUI,以便一切顺利进行。:)


Liv*_*eBT 22

使用 GVFS 通过 MTP 连接设备

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

此解决方案应该适用于所有提供 MTP 功能的Android 设备以及可能所有具有 MTP 功能的非 Android 设备,例如Windows PhonesPortable Media Players

不要混淆

有一些困惑,让我们试着澄清一下:

  • 并不需要做任何可能导致保修失效!

    • 您无需对设备进行 root。
    • 您不需要解锁引导加载程序。(你可以找到的Android她的指示ē)。

    解锁仅指此答案中的操作系统锁屏。

  • 您不需要通过某些 udev 规则配置开发人员对您设备的访问权限,例如 ADB、fastboot 或类似内容。(您可以在配置 USB 访问her e或 her e一章中找到有关 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并搜索您的产品 ID(使用Ctrl+ W)打开相应的 mtp udev 规则文件。如果找不到,则必须按照/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"
    
    Run Code Online (Sandbox Code Playgroud)

    如果这对您有用,您应该考虑针对libmtp 包(更准确地说是libmtp-common提交错误,以便将您的设备包含在未来版本中。

  4. 我还是连接不上

    您的设备要么不受底层支持,libmtp要么您可能会遇到与我的 Lumia 620 相同的问题,请按照我在LP#1247572 中发布的解决方法(重现步骤)进行操作:Nokia Lumia 620 (WP8) 无法通过以下方式可靠安装鹦鹉螺中的 gvfs-mtp。(该设备在这里仍然无法正常工作,但使用mtp-detect帮助。)

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

  5. 错误跟踪器将我的设备列为受支持的设备,但它仍然无法正常工作

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

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

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

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

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

      以下是截至2014 年 2 月 13日的软件包链接:libmtp-commonlibmtp-runtimelibmtp9mtp-tools

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

      cd "$HOME/Downloads"
      sudo dpkg -i *.deb
      
      Run Code Online (Sandbox Code Playgroud)
    4. 成功安装所有内容后,重新启动计算机,解锁您的 Android 设备,通过 USB 连接它,它应该会显示在您的文件管理器中。

    这对我 (@Glutanimate) 和我的摩托罗拉 Moto G 来说效果很好。因为我运行的是 Ubuntu 12.04 LTS,所以我首先必须安装gnome-gvfs. 有关详细信息,请参阅顶部13.04 之前的安装说明

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


bse*_*old 5

所有基于 的程序libmtp似乎仍然与 Galaxy Nexus 有问题(从 libmtp 1.1.3 开始)。基于gphoto2为我工作的程序。

我个人正在使用gphotofs,可在同名包中使用。

使用gphotofs ~/mymountpoint安装,然后fusermount -u ~/mymountpoint卸载时,即可大功告成。