2013年1月26日土曜日

AndroidでMediaScannerにACTION_MEDIA_SCANNER_SCAN_FILEを投げてもACTION_MEDIA_SCANNER_FINISHEDを投げ返してくれないのですが(^^);

BroadcastRecieverでMediaScannerConnection.scanFile()を呼べないので、MediaScannerサービスにブロードキャストでメディアスキャンをリクエストした。

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));


スキャン完了次第、Intent.ACTION_MEDIA_SCANNER_FINISHEDがブロードキャストされるだろうと思ってこんなBroadcastReceiverクラスを書く。

public class MediaScannerBroadcastReceiver extends BroadcastReceiver {

  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)) {
      Log.v(getTag(), "メディアスキャナー終了");
    }
  } // END onReceive()

} // END class

さらに、このクラスを使えるようにするために、AndroidManifest.xmlにこのような定義を追加した。(「file」のdataスキームを追加することがポイント)

<!-- メディアスキャナーからのブロードキャストインテントを受信するレシーバ -->
<receiver android:name=".MediaScannerBroadcastReceiver" >
    <intent-filter>
        <data android:scheme="file" />
        <action android:name="android.intent.action.MEDIA_SCANNER_FINISHED" />
    </intent-filter>
</receiver>

で、どうなるか?

メディアスキャンはされる。LogCatを見ているとスキャンされている様子がわかる。

しかし、完了通知が返ってこない(^^);

書き方がマズイのか?と思ってSDカードを抜き差ししてみると、この時はMEDIA_SCANNER_FINISHEDのブロードキャストを受信できた。

ということは、MEDIA_SCANNER_FINISHEDのブロードキャストは、SDカードをマウントした時にしか飛んでこないということ?

こうなったら、MediaScannerConnection.scanFile()だけをする新しいIntentServiceを作って、BroadcastRecieverからそこにインテントを投げるしか無いか・・・

追記13.01.28:結局こうなった
琴線探査: Androidのダウンロードマネージャで画像をダウンロードして完了を通知し、その通知をタップしたらその画像をギャラリーで開くには?