2011年6月2日木曜日

カメラやギャラリーピッカーからの画像取得周りまとめ2

前回のエントリーでカメラやギャラリーから画像を取得する周りまとめを書きましたが、
カメラからの画像取得に関して、国産端末で上手くいかないことが判明しましたので
こちらのエントリーで訂正させていただきます。


■国産の端末のほとんどでonActivityResultのdataパラメタにuriが入ってきません;;
前回エントリーを書いてからアプリを実際につくり、
国内メーカーの機種で試したところdata.getData()でuriが取得できない事が判明。
そこで保存先を明示することにしました。


まずカメラの呼び出しから
Uri uri; ←Activityクラスにプロパティとして置いてonActivityResultで参照できるように


カメラボタン押下などインテントの呼び出しを行う箇所の記述
------------------------------------------------------
//ContentValues
ContentValues values = new ContentValues();

//ファイル名を決めて
String filename = System.currentTimeMillis() + ".jpg";
//必要な情報を詰める
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
//Uriを取得して覚えておく、Intentにも保存先として渡す
uri= getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

//インテントの設定
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, resourceUri);
startActivityForResult(intent, CAMMERA_IMAGE);
------------------------------------------------------

Manifastへの外部ストレージへの書き出し許可のユーザーパーミッションは忘れないでください。



onActivityResultの修正
------------------------------------------------------
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (resultCode != RESULT_OK){
return;
}

//uriにnullを詰めるコードを消す

if (requestCode == GALLERY_IMAGE) {
resourceUri= data.getData();
}
else if(requestCode == CAMMERA_IMAGE){
//カメラからの戻りの場合はuriをdataから取得しない(起動時に指定したUriが入っている)
// uri =data.getData();
}

if(uri == null){
return;
}

try {
InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);

/*
//ファイルパスを取得したい場合は下記のようにContentResolverを活用する
//ContentResolver経由でファイルパスを取得
ContentResolver cr = getContentResolver();
String[] columns = {MediaStore.Images.Media.DATA };
Cursor c = cr.query(uri, columns, null, null, null);

c.moveToFirst();
File picture = new File(c.getString(0));
*/
} catch (Exception e){
// } catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
return;
}
}
------------------------------------------------------

上記の画像のロードはシンプルな実装ですが、前回も書いた通り下記の関数を噛ませてリサイズしながらロードすることを推奨します。
こちらから飛んでください

これで国産端末でもカメラから画像を取得できると思います。



Reference Link