2012-04-27 8 views
20

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_MOUNTEDACTION_MEDIA_REMOVEDしかデバイスが接続され、それぞれ切断されたときだけブロードキャストされることが分かった。つまり、MediaScannerは、再インストールするまでデバイスの変更を気付くことができません(ストックギャラリーアプリケーションを使用してダブルチェックしました - プラグを抜いてからAndroidに接続するまで、カメラに新しく作成された画像は表示されません再びデバイス)。外部SDカードのため、このマウントパスを取得しよう

は、私がEnvironment.getExternalStorageDirectory() API呼び出しを使用しますが、それは/mnt/sdcardではなく、カメラの一つです銀河のSDカードのパス をエミュレート利回り。それで私にとってもうまくいかない。

この問題は、AsyncTaskTimerTaskとなっている定期的なTimerイベントを開始したことで解決できました。このタスクはUSB接続を初期化し、デバイスを開き、 デバイスメモリ全体をスキャンし、最後に撮影した写真のみを取得し、デバイスディスクリプタとUSB接続を閉じます。

これを考慮すると、毎回5秒または10秒という非常に頻繁にかかる可能性があるたびに、これらのすべての操作を実行する必要があります。それは間違いなく素早くバッテリーを消耗させ、最後に撮影した写真を撮って前回撮影した写真と比較するだけで不必要なシステムI/Oを生成します(99%で同じ画像になります)。しかし、これを行うために。イベントベースの通知でオブザーバの仕組みを持つ方がずっと良いでしょう。

私の質問は、ハニカム以降のAndroidバージョンの外部USBストレージの変更について、上記の説明よりも効率的に通知する方法です。

答えて

2

あなたがより効率的な方法を望むなら、カメラは写真を撮ったということでusb経由である種の信号を送信する必要があります。私はそれをしていないと思う。

したがって、あなたがdiscribingされている方法を実行して、手動で確認する必要があります。

ストレージをマウント - >変更をチェック - >あなたの検出された変化とあなたのことを行います。私はあなたが「MTPの道」が、ここでは例のアプリケーション読み取るために使用したものを知らない

https://github.com/ynakanishi/Honeycomb-MTP-sample

はあなたが結果を救うことができるストレージ全体を毎回スキャンしないように、ファイル名を読み出しますたとえば、チェックして比較するたびに新しいものを見つけることができます。通常、ファイルの命名はカメラで同じ番号から始まります。したがって、空のSDカードを使用してセッションを開始する場合は、すでに写真のファイル名がわかっています。 img0001.jpgと言うことができます。したがって、成功するまでそのファイルを取得する関数を作成するだけで済みます。次のimg0002.jpgが必要な場合は、成功するまでそのファイルを取得するタスク/サービス/関数を書くことができます。

バッテリで節約したい場合は、USBバッテリを電源に接続するために、バッテリ/電源を追加で実装することができます。

AsyncタスクまたはtimerTaskの代わりに、ScheduledExecutorServiceを試して、消費電力が少ないかどうかを確認することができます。

あなたに新しい考えを与えた希望

関連する問題