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