Android Honeycombを搭載したDSLRカメラとSamsung Galaxy Tabがあります。 DSLRは、USBケーブルを使用してタブレットに接続されています(タブレットでホスト機能を有効にするUSBキット経由)。この外部カメラを使用して写真を撮ったときに通知を受けて、この画像をタブレットにダウンロードするか、画像から取得したメタ情報を含むToast通知を表示するような何かを行うようにしたいと思います。私の知る限りは、既存のツールのすべて(inotify
メカニズムの基礎となる使用FileObserver
のような、MediaContentProvider
など)を取得するようHoneycomb以降のAndroid用の外部USBストレージの変更を確認してください
変更を監視することができ、注目する特定のファイルやファイルシステムのパスを要求します。これは、2.x以前のAndroidバージョンでブロック層プロトコルをサポートするまでは十分でした。デバイスを接続すると、デバイスのファイルシステムのどこかにマウントされ、これらのツールの監視ポイントとしてこのマウントポイントを使用することができました。
ハニカムGoogleがMedia Transfer Protocol
に外部USBデバイスへのアクセス方法を変更したので、これのサブセットとしてPTP
があります。 Androidデバイスに外付けUSBデバイスを接続すると、マウントポイントは表示されません(私はadb shell
とそれに続くmount
コマンドを使用しています)。さらに、MTP
実装では、明らかに高いレベルの抽象化として機能し、単なる整数値であるストレージIDを使用します。私は何とかこれらのストレージIDを実際のパス/マウントポイントに変換する方法があることを望んでいたが、明らかに存在しないように見える。
すでに私はそれがデバイスからアクセス可能なメディアファイル内の特別なIntent
放送時にそこにいるの変更で、この問題を管理することができ推測し、私は既存の、適切なIntents
を探し始めた私のデバイス上で実行されているAndroidのMediaScanner
考えます通知のために、運がない - 私はACTION_MEDIA_MOUNTED
とACTION_MEDIA_REMOVED
しかデバイスが接続され、それぞれ切断されたときだけブロードキャストされることが分かった。つまり、MediaScanner
は、再インストールするまでデバイスの変更を気付くことができません(ストックギャラリーアプリケーションを使用してダブルチェックしました - プラグを抜いてからAndroidに接続するまで、カメラに新しく作成された画像は表示されません再びデバイス)。外部SDカードのため、このマウントパスを取得しよう
は、私がEnvironment.getExternalStorageDirectory()
API呼び出しを使用しますが、それは/mnt/sdcard
ではなく、カメラの一つです銀河のSDカードのパス をエミュレート利回り。それで私にとってもうまくいかない。
この問題は、AsyncTask
のTimerTask
となっている定期的なTimer
イベントを開始したことで解決できました。このタスクはUSB接続を初期化し、デバイスを開き、 デバイスメモリ全体をスキャンし、最後に撮影した写真のみを取得し、デバイスディスクリプタとUSB接続を閉じます。
これを考慮すると、毎回5秒または10秒という非常に頻繁にかかる可能性があるたびに、これらのすべての操作を実行する必要があります。それは間違いなく素早くバッテリーを消耗させ、最後に撮影した写真を撮って前回撮影した写真と比較するだけで不必要なシステムI/Oを生成します(99%で同じ画像になります)。しかし、これを行うために。イベントベースの通知でオブザーバの仕組みを持つ方がずっと良いでしょう。
私の質問は、ハニカム以降のAndroidバージョンの外部USBストレージの変更について、上記の説明よりも効率的に通知する方法です。