24 October 2015

(Linux) MTPモードのAndroidのUSB接続で認識しないとき

Android機をUSB接続して、外部ストレージとして認識しない場合、マスストレージ(MSC)ではなくMTPで接続されている場合が多い。

とりあえず、MTPのドライバや設定ファイルが「ちゃんとセットアップされているか」を、段階を追ってチェックしてみると良い。

検証環境

・ Ubuntu 14.04 LTS
・ Xperia M4 Aqua

参考資料 : 『Connect an Android device using MTP in Ubuntu 14.04 LTS

MTPドライバとツールのインストール

ドライバとツールのインストール

$ sudo apt-get install libmtp-common mtp-tools libmtp-dev libmtp-runtime libmtp9

FUSEの設定追加

/etc/fuse.conf
# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)
 
# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#mount_max = 1000
 
# Allow non-root users to specify the allow_other or allow_root mount options.
#user_allow_other
 
user_allow_other       ← この行追加

Android機のベンダーIDとプロダクトIDを登録する

まず、IDを調べる。次の例では、緑色のところが該当機種のID

$ lsusb 
Bus 002 Device 003: ID 0bda:0118 Realtek Semiconductor Corp. Mass Storage Device
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 009: ID 0fce:01c4 Sony Ericsson Mobile Communications AB 
Bus 001 Device 005: ID 046d:c52f Logitech, Inc. Unifying Receiver
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 003: ID 1267:0103 Logic3 / SpectraVideo plc G-720 Keyboard
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

MTPドライバのデバイス認識ルールを追加する。前後の機種の例を真似て、次のサンプル設定ファイルでは太字の部分のような設定を追加する。

/lib/udev/rules.d/69-libmtp.rules
Unable to open ~/.mtpz-data for reading, MTPZ disabled.# UDEV-style hotplug map for libmtp
# Put this file in /etc/udev/rules.d
 
 〜 省略 〜
 
# SONY Xperia Tablet Z MTP 2
ATTR{idVendor}=="0fce", ATTR{idProduct}=="0194", SYMLINK+="libmtp-%k", MODE="660", GROUP="audio", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
# SONY Xperia SP MTP
ATTR{idVendor}=="0fce", ATTR{idProduct}=="0195", SYMLINK+="libmtp-%k", MODE="660", GROUP="audio", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
# SONY Xperia M4
ATTR{idVendor}=="0fce", ATTR{idProduct}=="01c4", SYMLINK+="libmtp-%k", MODE="666", GROUP="audio", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
# SonyEricsson IS12S Xperia Acro MTP+CDROM
ATTR{idVendor}=="0fce", ATTR{idProduct}=="4157", SYMLINK+="libmtp-%k", MODE="660", GROUP="audio", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
 
 〜 省略 〜

ドライバのリロード

$ sudo service udev restart

Ubuntu 16.04での再検証

FUSEの設定追加は必要ではなかった

/etc/fuse.conf
# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)
 
# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#mount_max = 1000
 
# Allow non-root users to specify the allow_other or allow_root mount options.
#user_allow_other       ← この行はコメントアウトのままで問題なし

MTPドライバのデバイス認識ルールは、読み書き属性だけを指定しておけばよかった。adbとmtpの接続モードごとに、idProductが変化するのを忘れがち…

/etc/udev/rules.d/50-udev.rules
# Amazon Fire HD 10
SUBSYSTEM=="usb", ATTR{idVendor}=="1949", ATTR{idProduct}=="0282", MODE="0666", GROUP="plugdev"
 
# Amazon Fire HD 8 (mtp, file transfer)
SUBSYSTEM=="usb", ATTR{idVendor}=="1949", ATTR{idProduct}=="0332", MODE="0666", GROUP="plugdev"
# Amazon Fire HD 8 (adb)
SUBSYSTEM=="usb", ATTR{idVendor}=="1949", ATTR{idProduct}=="0338", MODE="0666", GROUP="plugdev"