honeycomb 3.1 mtp 解説

14
MTP API for integrating with external cameras

Upload: yoshiaki-nakanishi

Post on 22-Nov-2014

2.722 views

Category:

Technology


7 download

DESCRIPTION

ABC 2011 Summer のデ部によるHoneycomb API解説での担当分その23.1で追加されたMTPについて、実装時にひっかかりそうな部分を中心に解説

TRANSCRIPT

Page 1: Honeycomb 3.1 MTP 解説

MTP API for integrating with external cameras

Page 2: Honeycomb 3.1 MTP 解説

MTP

MTP = Media Transfer Protocol画像、音楽、動画などのメディアデータを転送するプロトコル

PCとデジカメや音楽プレイヤーとの間のデータ転送に用いられる

USB Mass Storage のように直接ファイルシステムを見せるのではなく、論理的な階層構造でメディアデータを見せる

Page 3: Honeycomb 3.1 MTP 解説

MTP要素の包含関係デバイス

ストレージ(複数存在してもよい)

論理ルート フォルダ

オブジェクト

オブジェクト

・・・

オブジェクト

オブジェクト

・・・

オブジェクト

Page 4: Honeycomb 3.1 MTP 解説

クラス概要

MtpConstants MTPオブジェクトの型識別子(フォルダ、データフォーマット)などの定数をまとめたもの

MtpDevice MTPデバイスをカプセル化したものオブジェクト実体データの取り出しなど、このクラスのメソッドを通じて行う

MtpDeviceInfo MTPデバイスの情報デバイスID、デバイス名など

MtpObjectInfo MTPデバイス内のオブジェクトの情報オブジェクトサイズ、画像サイズ、サムネイルサイズなどを保持

MtpStorageInfo MTPデバイス内のストレージユニットの情報ストレージ全体の容量、空き容量などを保持

Page 5: Honeycomb 3.1 MTP 解説

MTP処理フロー概要

USBデバイスを取得し、それからデバイスとのコネクションも取得する

USBデバイスを用いてMtpDeviceインスタンスを取得する

USBデバイスとのコネクションを用いて、MtpDeviceインスタンスをopenする

MTPデバイス内のストレージを取得する

ストレージ内のオブジェクトを取得する

オブジェクトから情報取得、操作を行う

Page 6: Honeycomb 3.1 MTP 解説

MTPデバイスオープンAndroidManifet.xml:<!-- USB Host API のやり方と同じなので省略 -->

xml/device_filter.xml:<!-- 前略 --> <!-- デジカメの場合、クラス6を対象にする(参考 UsbConstants) --> <usb-device class=”6” /><!-- 後略 -->

プログラム:UsbDevice device = (UsbDevice) intent.getParcelableExtra(...);UsbDeviceConnection conn = mUsbManager.openDevice(device);MtpDevice mtpDevice = new MtpDevice(device);mtpDevice.open(conn); // エラーチェック省略

Page 7: Honeycomb 3.1 MTP 解説

ストレージ取得

プログラム:int[] storageIds = mtpDevice.getStorageIds();

for (int storageId : storageIds) {// 各ストレージごとのオブジェクト探索処理などをここで行う

}

Page 8: Honeycomb 3.1 MTP 解説

オブジェクト取得プログラム:// ストレージのルート上の全種別のオブジェクトを取得する// データ種別を限定する場合、第二引数でフォーマットを指定するint[] objectHandles = mtpDevice.getObjectHandles(storageId, 0, // フォーマット(0は全フォーマット) 0 // 親オブジェクト(0はルート));

for (int objectHandle : objectHandles) {MtpObjectInfo objectInfo = mtpDevice.getObjectInfo();if (mtpObjectInfo.getAssociType()

== MtpConstants.ASSOCIATION_TYPE_GENERIC_FOLDER) {// フォルダを親に指定して、再帰的にスキャンする

} else {// オブジェクトの情報取得、処理などを行う

}}

Page 9: Honeycomb 3.1 MTP 解説

Tips

UIスレッドでMTP処理をしないこと

オブジェクト取得の時間は、塵も積もれば山となるので、UIスレッドでの実行はタブー

参考:オブジェクト取得時間 (画像読み出しを含まず)

Cybershot DSC-HX5 30msec

iPhone4 10msec

Page 10: Honeycomb 3.1 MTP 解説

Tips (cont’d)

MTPの階層構造は論理的なものなので、同一オブジェクトが異なる位置にあらわれる場合がある(メーカ間の共通性なし)

iPhone:ルートフォルダ直下と下位フォルダ内に同じオブジェクトが存在する(重複を排除する処理が必要)

Galaxy S(Win7 PC接続時):Mass Storage接続と同じ階層構造が見える(外部ストレージ内の全ファイルが見える)

Page 11: Honeycomb 3.1 MTP 解説

Tips (cont’d)

写真データ以外も補助が無いだけで取り扱い可能

MtpDevice クラスのメソッドでオブジェクトのraw byte配列取得や、ファイルコピーが可能

Page 12: Honeycomb 3.1 MTP 解説

Honeycomb 3.2

Media FrameworkApplications that use the platform's media provider (MediaStore) can now read media data directly from the removeable SD card, where supported by the device. Applications can also interact with the SD card files directly, using the MTP API.

プラットフォームのmedia provider (MediaStore)を使用するアプリケーションは、デバイスがサポートするリムーバブルSDカードから直接メディアデータを読み出すことができる。アプリケーションはまた、MTP APIを用いてSDカードのファイルに直接アクセスすることもできる。

Page 13: Honeycomb 3.1 MTP 解説

おまけ参考情報

Honeycomb 3.1 は、MTPモードのGalaxy S と正常に接続できない

ホスト側 Motorola XOOMで確認

2回の DEVICE_ATTACHED インテント発生

1回目のインテントからはUsbDeviceConnectionを取得できない

2回目のインテントからはMtpDeviceインスタンス生成が出来ない(new から返ってこない)

Page 14: Honeycomb 3.1 MTP 解説

詳しくはWEBで!