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: 画面に合わせて画像を縮小して読み込む | 自転車で通勤しましょ♪ブログ