こんにちは、岩井と申します。
onScanCompleted()が呼び出されないというのは謎ですが、scanFile(Filename, MimeType)を呼ぶ際に
「拡張子がいい感じ」
「MimeTypeをちゃんと指定する」
のいずれかを満たしていないとスキャンに失敗するっぽいですね。
私の環境(Android1.6+エミュレータ and Android2.1+HTC Desire)では、下記のコードで動作しました。
public class アクティビティ {
public void 適当なイベントリスナ() {
MediaScannerConnection scanner = new
MediaScannerConnection(getApplicationContext(), client);
MyClient client = new MyClient();
client.setScanner(scanner);
scanner.connect();
}
class MyClient implements
MediaScannerConnection.MediaScannerConnectionClient {
private MediaScannerConnection _scanner = null;
public void setScanner(MediaScannerConnection scanner)
{ _scanner = scanner; }
public void onMediaScannerConnected() { _scanner.scanFile("/
sdcard/sample.png", null); }
public void onScanCompleted(String path, Uri uri) {
_scanner.disconnect();
// pathは、"/sdcard/sample.png"ってな感じ
// uriは、"content://media/external/images/media/117"ってな感じ
try { Bitmap bitmap =
MediaStore.Images.Media.getBitmap(getContentResolver(), uri); } catch
(Exception ignore) { }
}
}
}
また、名前で画像を検索して表示するといった要件を満たすには、ファイルスキャン完了イベントで駆動させるより
ContentResolverを使用してメディアのデータベースに問い合わせたほうがカッコイイ気がします。
(以下に、サンプルを書いてみました)
// ファイル名に"sample"を含む画像ファイルを検索し、ファイル名とパスを取得する
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA },
MediaStore.Images.Media.DISPLAY_NAME + " like ?",
new String[] { "%sample%" },
null);
while (cursor.moveToNext())
{
String filename =
cursor.getString( cursor.getColumnIndex( MediaStore.Images.Media.DISPLAY_NAME ) );
String filepath =
cursor.getString( cursor.getColumnIndex( MediaStore.Images.Media.DATA ) );
Bitmap bitmap = BitmapFactory.decodeFile(filepath);
// などなど
}
以下、蛇足です。
MediaScannerなんてのは初めて見たので、調べた範囲でまとめてみました。
(1)Media Scanner Serviceとは
端末の内部/外部ストレージに格納されている各種メディアファイルの情報を集約しデータベース化しておくサービスである。(たぶん…)
(2)MediaScannerConnectionとは
新たに作成orダウンロードしたメディアファイルを、「MediaScannerサービス」に登録する手段を提供するためのクラスである。
(原文:MediaScannerConnection provides a way for applications to pass a
newly created or downloaded media file to the media scanner service.)
(3)MediaScannerConnectionClientとは
MediaScannerConnectionを利用するアプリケーションに対し、下記のタイミングでその旨を通知するためのインターフェースを定義し
たクラスである。
・「MediaScannerサービス」への接続ができた
・ファイルのスキャンニングが完了した
(原文:An interface for notifying clients of MediaScannerConnection when
a connection to the MediaScanner service has been established and when
the scanning of a file has completed.)
参考:
http://code.google.com/p/i-jetty/source/browse/trunk/webapps/console/src/main/java/org/mortbay/ijetty/console/MediaBrowserServlet.java?spec=svn360&r=360
http://d.hatena.ne.jp/umezo/20100608/1276014215
http://android-dev.g.hatena.ne.jp/sakira09/