カメラ から 画像 を 取得 する方法( Xperia とそれ以外)
前回
Android端末 や カメラ から 画像 を 取得 する方法
という記事を書きましたが、
実はこれには致命的な問題がありました。
私は普段 Xperia をメインに使っているので
Xperia でアプリ開発をしているんですが、
カメラ からの 画像取得 の方法が Xperia とそれ以外の端末で違うみたいなのです。
![]()
カメラ からの 画像 取得 は、
これ↓で 取得 して
//写真の選択
private void setPhoto() {
String[] str_items = {getString(R.string.pick_message02), getString(R.string.pick_message03)};
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_menu_more)
.setTitle(getString(R.string.pick_message01))
.setItems(str_items, new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
if (which==0) {
//ギャラリーの起動
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "Select picture"), 999);
} else {
//カメラの起動
Intent intent = new Intent();
intent.setAction("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 999);
}
}
})
.show();
}
これ↓でImageViewにセットしてました。
//写真選択インテント呼び出しからの戻り
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 999) {
if (resultCode == RESULT_OK) {
//画像のセット
ivPhoto.setImageURI(data.getData());
}
}
}
Xperia で動かしているときは全く問題なかったので
すべての機種でちゃんと動いていると思い込んでいたんですが、
IS05で試してみた時に
カメラ の 起動 と撮影まではうまくいくんですが
元のActivityに戻ってきたときに 画像 がセットされないことに気が付きました。
「IS05 だけ特殊なのか!?」と思ってたんですが、
どうも Xperia だけ動きが違うみたいです・・・orz
ギャラリーからの画像取得と
Xperiaのカメラ画像取得では
data.getData() で画像のURIが取得できるんですが、
それ以外の端末のカメラ画像取得では
data の値が null になってしまうようです。
なので、data data.getData() の値をチェックし
null 値だったらファイルを読みにいくようにしてあります。
//写真選択インテント呼び出しからの戻り
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 999) {
if (resultCode == RESULT_OK) {
//ギャラリーか、Xperiaの場合
// Xperia以外ではdata, data.getDataがnullで返ってくる
if (data!=null && data.getData()!=null) {
ivPhoto.setImageBitmap(uri2bmp(this, data.getData(), (int)(280*scaledDensity), (int)(280*scaledDensity)));
} else {
//Xperia以外の場合
ivPhoto.setImageBitmap(uri2bmp(this, currentData.photo, (int)(280*scaledDensity), (int)(280*scaledDensity)));
}
}
}
}
カメラ画像の取得は
前の記事の「大きい画像を取得する」バージョンを使ってます。
こちらの記事も参考にしてみてください。
・インテントでカメラを呼び出す方法の補足(主に、Xperia 2.1問題対応)
・Xperia 2.1でカメラアプリ起動して画像データ取得
ちなみに取得してきた画像をそのままImageViewにセットしようとすると
サイズが大きすぎて OutOfMemoryError が起きることがあります。
なので上記コードでは、uri2bmpメソッドで
URIから最大サイズを指定してBitmapを取得するようにしてます。
uri2bmpメソッドはこちら。
//ファイル→ビットマップ(最大サイズ指定)
public static Bitmap uri2bmp(Context context,Uri uri,int maxW,int maxH) {
BitmapFactory.Options options;
InputStream in=null;
try {
//画像サイズの取得
options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
in=context.getContentResolver().openInputStream(uri);
BitmapFactory.decodeStream(in,null,options);
in.close();
int scaleW=options.outWidth /maxW+1;
int scaleH=options.outHeight/maxH+1;
int scale =Math.max(scaleW,scaleH);
//画像の読み込み
options=new BitmapFactory.Options();
options.inJustDecodeBounds=false;
options.inSampleSize=scale;
options.inPurgeable=true;
in=context.getContentResolver().openInputStream(uri);
Bitmap bmp = BitmapFactory.decodeStream(in, null, options);
in.close();
return bmp;
} catch (Exception e) {
try {
if (in!=null) in.close();
} catch (Exception e2) {
}
return null;
}
}
しかし、なぜXperiaだけ・・・。
みなさんも気を付けてください。
▽カメラ から 画像 を 取得 する方法( Xperia とそれ以外) のキーワード
▽次の記事、前の記事
Android端末 や カメラ から 画像 を 取得 する方法 | Android で GoogleMaps を扱うときに役に立つ書籍
▽カメラ から 画像 を 取得 する方法( Xperia とそれ以外) にトラックバックする
カメラ から 画像 を 取得 する方法( Xperia とそれ以外)のトラックバックURL:
http://chu3.xsrv.jp/mt5/mt-tb.cgi/731
今日のキーワード
当サイトのRSS
カテゴリー
スポンサード リンク
新着記事
月別アーカイブ
オススメ書籍
【中級者必携の3冊】
目的から実現方法を探すいわゆる逆引き本。ネットで探してた情報が1冊にまとまっている感じです。
こちらも逆引き本。しかも情報量が多くて分厚い辞書的な1冊。必ず手元に置いておきたい1冊です。
様々なUIテクニックが載っている1冊。レイアウト関係でここまで詳しい本は他にありません。UIに強くなりたいなら必須。
Copyright (C) 2012 All Rights Reserved Android アプリ の 研究所 アンドロイド ナビ