7C00.ME/houmu 2015-11-05

Ubuntu 14.04 MTP连接MIUI7

最近把我的手机(Lenovo A808T)刷了MIUI 7的ROM。

之前一直用的是另一个第三方的ROM。这个ROM非常精简,几乎接近原生Android系统,用起来十分流畅,所以我用了相当长的时间。但是这个ROM一直有两个问题比较闹心,一个是“设置”APP有bug,另一个就是不能使用MTP连接Ubuntu。由于对系统流畅度的偏爱,我对这些问题也就忍耐一下忽略了。系统用久了也会产生审美疲劳,上述问题跟着就放大了,心里就萌生了换个ROM的念头。正好又看到论坛上有适配我的手机的MIUI 7的ROM,于是就重刷了MIUI 7。

MIUI 7相比之前那个ROM,漂亮不少,也稍微更加好用。但是仍然不能通过MTP连接Ubuntu。之前遇到同样问题的时候,我也上网搜了一下,但是那个ROM比较小众,找不到多少有用资料。由于ROM是从其他手机移植过来的,我主要怀疑ROM本身某些模块存在缺陷。平时需要手机和电脑互传文件的时候,大多是通过adb push/pull。不过,刷了MIUI 7还出现这个问题,加上最近在玩一台MIUI 7的小米平板同样也有这个问题,就引起我的注意了。或许是其他原因?

于是就在网上大搜特搜了,网上关于类似问题的文章提到的解决办法几乎都尝试了一遍,屡败屡战,直到看到这篇文章才搞定。具体做法:

  1. sudo apt-get install mtp-tools mtpfs ,Ubuntu 14.04 Desktop 是自动安装了这个这两个软件包的,所以这一步可以不作,但是能防止有时候手欠,主动把他们删了;
  2. sudo lsusb,查看usb设备号,记下手机的那行,比如 Bus 002 Device 029: ID 17ef:7718 Lenovo
  3. sudo echo 'user_allow_other' >> /etc/fuse.conf,也可以把/etc/fuse.conf文件中#user_allow_other这行前面的注释去掉;
  4. sudo vi /lib/udev/rules.d/69-libmtp.rules 加上这行(注意把Vendor,idProduct对应项改为实际值,下同):

     ATTR{idVendor}=="17ef", ATTR{idProduct}=="7718", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
    
  5. sudo vi /etc/udev/rules.d/51-android.rules(这个文件可能不存在,生成一个即可)加上这行:

    ATTR{idVendor}=="17ef", ATTR{idProduct}=="7718", MODE=”0666"
    
  6. sudo udev restart,重启udev服务;
  7. sudo reboot,这个应该不是必须的。

从解决办法来分析原因,发现MIUI不能MTP连接Ubuntu的主要原因是它的设备类型还不能被识别为mtp,而上述编辑操作相当于添加白名单,让系统知道现在连接的usb设备支持mtp。在编辑/lib/ude/rules.d/69-libmtp.rules时,可以发现这个文件非常长,而且可以预测随着时间的推移,这个文件会越来越长。在我看来,这是Linux MTP机制的设计缺陷。在Windows平台上,有的Android手机在通过第一次usb连接的时候会弹出安装驱动的对话框,应该是Windows上关于MTP的一种处理机制。相比之下,Windows上的做法更用户友好一点。