Android でギャラリーから画像取得できない

Android

1 参考にしたサイト

下記サイトを参考にギャラリーから画像を取得するプログラムを書くも
エミュレータだとエラーではじかれ、
実機だと BitmapFactory.decodeStream から null が返される。
ギャラリーから画像を取得する - Androidプログラマへの道 〜 Moonlight 明日香 〜 - livedoor Wiki(ウィキ)


2 ポイント

① BitmapFactory.decodeStream で取得できるファイルサイズに制限
→ ギャラリーから取得した画像ファイルが大きければ縮小する必要有り。


②画像サイズを取得するために下記4つのことをする。
1) 画像サイズを取得するには[*]、inJustDecodeBounds に true を指定して、
2) openInputStream(data.getData())
3) BitmapFactory.decodeStream(in, null, options) を実施
4) そして画像サイズ計算に必要な各種パラメータを取得

③逆に表示用に画像を取得するときは、下記4つのことをする。
5) options.inJustDecodeBounds に false を指定
6) 同じくopenInputStream(data.getData())
7) BitmapFactory.decodeStream(in, null, options) を実施
8) 画像を表示させる。

(`・ω・´)つ 画像サイズ取得用に画像取得の処理を1回、
画像取得用に画像取得の処理を1回ずつ行う必要がある。

めんどくさいお...(´・ω・`)



3 修正したコード

青字は、サイズ取得用に生成したオブジェクト
赤字は、実際の画像表示用に生成したオブジェクト

// ファイルサイズを取得するために、
// InpuStream を取得
InputStream in
= getContentResolver().openInputStream(data.getData());


// Options を取得、画像サイズ等が登録されている。
// 逆に画像を生成するときは Options オブジェクトにサイズを指定して生成
BitmapFactory.Options options = new BitmapFactory.Options();


// ファイルサイズを取得するために、
// inJustDecodeBounds を true に。
options.inJustDecodeBounds = true;


// ファイルサイズを取得するために、
// decodeStreamを実施
// サイズ計算に必要な値が options に記載される。
BitmapFactory.decodeStream(in, null, options);
int sample_size = 0;

//500Kピクセル超えてる場合は小さく
if((options.outWidth * options.outHeight) > 548576){
    double out_area
        = (double)(options.outWidth * options.outHeight) / 500000;
    sample_size = (int) (Math.sqrt(out_area) + 1);

//小さい場合はそのまま
}else{
    sample_size = 1;
}

// ファイルサイズを取得するために、
// 取得した InpuStream を閉じる。
in.close();


// 画像表示用に false に変更
options.inJustDecodeBounds = false;
options.inSampleSize = sample_size;


// 画像表示用に InpuStream を再度取得。
in = getContentResolver().openInputStream(data.getData());


// 画像表示用に BitmapFactory.decodeStream を再度実行。
Bitmap img = BitmapFactory.decodeStream(in, null, options);
in.close();

 

補足

なお上記のコードは、下記を参考にしています。
Android: 画面に合わせて画像を縮小して読み込む | 自転車で通勤しましょ♪ブログ