カメラ から 画像 を 取得 する方法( Xperia とそれ以外)

カメラ から 画像 を 取得 する方法( Xperia とそれ以外) 前回 An...

カメラ から 画像 を 取得 する方法( Xperia とそれ以外)

mixiチェック

カメラ から 画像 を 取得 する方法( Xperia とそれ以外)

前回
Android端末 や カメラ から 画像 を 取得 する方法
という記事を書きましたが、
実はこれには致命的な問題がありました。

私は普段 Xperia をメインに使っているので
Xperia でアプリ開発をしているんですが、
カメラ からの 画像取得 の方法が Xperia とそれ以外の端末で違うみたいなのです。
 
cigar04.png
 

カメラ からの 画像 取得 は、
これ↓で 取得 して

    //写真の選択
    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 を扱うときに役に立つ書籍

Android アプリ の 研究所 アンドロイド ナビ:新着記事

incorrect AVA format エラー(署名作成時) : 2012年2月25日
署名作成時に Keytool-error: java.io.IOExceptio...
アイデアがどんどん湧く! 9マスメモアプリ : 2011年11月13日
先日、2011年11月11日の11時11分。 この100年に一度の1ならび、 し...
Androidで電子書籍 : 2011年11月 5日
Androidアプリの開発者として また純粋にAndroidのファンとして 日夜...
Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE : 2011年11月 5日
Eclipse から実機にアプリをインストールするときに 下記のエラーが出ました...
iPhone4S へ iPhone3GS のデータが移行されない時の対処方法 : 2011年10月23日
iPhone4Sをやっと手に入れることができました。 購入したのは、64GB の...
たーかーのーつーめー : 2011年10月22日
「たーかーのーつーめー」 でおなじみの『鷹の爪団』。 その中で活躍する『吉田くん...
iPhone4S の新音声機能である Siri がすごいらしい : 2011年10月13日
iPhone4S のみで使える新機能である Siri がすごいと話題です。 ちな...
iPhone4S を買うなら SoftBank ? au ? : 2011年10月10日
ついに iPhone4S の予約が SoftBank と au から10/7(金...
画面サイズとVGAとかの対応表 : 2011年10月 7日
Andoridの端末には様々な画面サイズがあります。 それぞれの画面サイズに最適...
iPhone のように指にくっついてスライドするUI : 2011年10月 7日
iPhone では、画面に表示されている写真などを入れ替えるとき、指で左右にフリ...

▽カメラ から 画像 を 取得 する方法( Xperia とそれ以外) にトラックバックする

カメラ から 画像 を 取得 する方法( Xperia とそれ以外)のトラックバックURL:
http://chu3.xsrv.jp/mt5/mt-tb.cgi/731

今日のキーワード

当サイトのRSS

カテゴリー

Twitterボタン

アンドロイドナビについて / 記事投稿してみませんか? / イベント情報募集
Copyright (C) 2012 All Rights Reserved Android アプリ の 研究所 アンドロイド ナビ