カメラ から 画像 を 取得 する方法( 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 アプリ の 研究所 アンドロイド ナビ