SDカードから画像の読込ができません。

953 views
Skip to first unread message

あゆた

unread,
Sep 6, 2010, 2:13:46 AM9/6/10
to 日本Androidの会
こんにちは。あゆたと申します。

現在、カメラを使って画像をSDカードに保存し、その保存した画像を保存時に付けた名前をもとに検索し、画面に表示させる、というアプリを作成していま
す。

単純なものだと思っていたのですが、SDカードからの呼び出しに苦戦しています。

SDカードには、
FileOutputStream fos = null;
File dir = new File("/sdcard/cameraEx/");
dir.createNewFile();
fos = new FileOutputStream(dir + fileName);
fos.write(w);

という感じで保存しています。
保存自体はちゃんとされています。

そして、その後に、MediaScannerConnectionClientを継承させたクラス内の
onMediaScannerConnected() メソッド内で
mConnection.scanFile(mPath, mMimeType);
としているのですが、ここから
onScanCompleted(String path, Uri uri)
に飛びません。

私としては、ここで
btm = BitmapFactory.decodeFile(path);
という風に画像を取り出したいと思っていたのですが、全然思い通りにいきません。
パスが間違っているのか、そもそもMediaScannerConnectionを使おうとしているのが悪いのか。。。

アドバイスを頂けないでしょうか。

よろしくお願いいたします。

Tomoki Iwai

unread,
Sep 8, 2010, 4:43:37 AM9/8/10
to 日本Androidの会
こんにちは、岩井と申します。


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/

あゆた

unread,
Sep 12, 2010, 8:51:08 AM9/12/10
to 日本Androidの会
岩井様

大変丁寧なご指導ありがとうございます。

onScanCompletedメソッド内での処理は諦めていましたが、おかげで使えそうな気がしてきました!

実際に取り掛かってみようと思います。

ありがとうございます。
> 参考:http://code.google.com/p/i-jetty/source/browse/trunk/webapps/console/...
> > よろしくお願いいたします。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
Reply all
Reply to author
Forward
0 new messages