Androidアプリで写真の選択or新しく写真を撮ってからプレビューする

アンドロイドアプリでカメラでモノを撮影して、それをプレビュー表示した後に
サーバ側にストアするなんてのを作ろうとしています。今回のエントリはとりあえずプレビューまで。

 
■ 概要
一つの画面に、
 - 写真をとる
 - 写真を選択する
ってボタンがあるとします。
 
撮るか選ぶかのどちらかのオペレーションをした後、その画面上に
 - 320*320にリサイズした画像
 - 64*64にリサイズした画像(サムネイル用)
をプレビューする的な。
 
■ 実装
ActivityのonCreateの中で、写真ととるが押されたのか、写真を選択するが押されたのか、リスナを作ります。
 
– 写真を撮るボタンのオンクリックイベントをひろうリスナ

Button takePhotoBtn = (Button) this.findViewById(R.id.takePhotoButton);
takePhotoBtn.setOnClickListener(new OnClickListener(){
    public void onClick(View arg0) {
        takePhotoButtonOnClick();
    }
});

 
– 写真を選ぶボタンのオンクリックイベントをひろうリスナ

Button chooseBtn = (Button) this.findViewById(R.id.chooseButton);
chooseBtn.setOnClickListener(new OnClickListener(){
    public void onClick(View arg0) {
        chooseButtonOnClick();
    }
});

 
んで、いよいよ実処理です。
 
– 写真を撮るメソッド。IMAGE_CAPTUREってアクションをIntentにセットしてあげます。

protected void takePhotoButtonOnClick() {
    Intent intent = new Intent();
    intent.setAction("android.media.action.IMAGE_CAPTURE");
    startActivityForResult(intent, 11);
}

startActivityForResultの第二引数は適当な値で、選択と被らないようにしてやる事で、
撮るのか選択なのかってのを後から判別するために使います。
このメソッドが呼ばれるとカメラが立ち上がって、写真撮った後にonActivityResultってメソッドが
呼ばれるようになります。Androidが裏側でよしなにやってくれるイメージです。
 
– 写真を選択するメソッド

protected void chooseButtonOnClick() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent, 10);
}

こちらはSDカードにアクセスして、画像だけけを選択できるようにしてやってる感じです。
こちらもstartActivityForResultを読んだ後に、onActivityResultがAndroidから
呼び出されるような感じになっています。第二引数を撮るとは別にしておきます。
 
– 画像をリサイズしてプレビュー表示するメソッド。結構、今回のメインなところ。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Log.d("RequestCode",String.valueOf(requestCode));
        Log.d("ResultCode",String.valueOf(resultCode));
    else {
        // エラー画面でも表示させる感じですかね。
        return;
    }

onActivityResultはstartActivityForResultでセットしたリクエストのコード(撮るが11、選択が10)が
渡されてくるのでそれでどっちかを判別できます。
ただし結果が不正だったら元も子もないわけで、結果コードは第二引数で判別します。
 
– Bitmapを作る

// Take a Photo
if (requestCode == 11) {
    image = (Bitmap) data.getExtras().get("data");

// Choose Image
} else if (requestCode == 10) {
    InputStream in = getContentResolver().openInputStream(data.getData());
    image = BitmapFactory.decodeStream(in);
}

写真を撮った後の場合はリクエストコード11で判別して上記のようにやるとBitmapが取得できます。
写真を選択した後の場合はリクエストコード10で判別してストリームから作ってやる感じになります。
#見た目わかりずらくなっちゃうとアレなので載せませんがリソース開くときはtry-catchでどうのとか必要です。
 
– 画像をリサイズしてImageViewにセット
ググってきた情報の組み合わせなのですが、BitmapクラスのcreateScaledBitmapを使うよりもイイ感じっぽかったです。

int srcWidth = image.getWidth(); // original width
int srcHeight = image.getHeight(); // original height

///////////////////
// Large(320*320)
///////////////////
ImageView imgLargeView = (ImageView)findViewById(R.id.imageLargeView);

float screenLargeWidth = 320;
float screenLargeHeight = 320;

float widthLargeScale = screenLargeWidth / srcWidth;
float heighLargetScale = screenLargeHeight / srcHeight;

Matrix largeMatrix = new Matrix();
largeMatrix.postScale(widthLargeScale, heighLargetScale);

Bitmap largeImage = Bitmap.createBitmap(image, 0, 0, srcWidth, srcHeight, largeMatrix, true);
imgLargeView.setImageBitmap(largeImage);

/////////////////////
// Thumbnail(64*64)
/////////////////////
ImageView imgThumbnailView = (ImageView)findViewById(R.id.imageThumbnailView);

float screenThumbnailWidth = 64;
float screenThumbnailHeight = 64;

float widthThmubnailScale = screenThumbnailWidth / srcWidth;
float heighThmubnailScale = screenThumbnailHeight / srcHeight;

Matrix thumbnailMatrix = new Matrix();
thumbnailMatrix.postScale(widthThmubnailScale, heighThmubnailScale);

Bitmap thumbnailImage = Bitmap.createBitmap(image, 0, 0, srcWidth, srcHeight, thumbnailMatrix, true);
imgThumbnailView.setImageBitmap(thumbnailImage);

 

初歩からわかるAndroid最新プログラミング
安生 真 柴田 文彦 藤枝 崇史
インプレスジャパン
売り上げランキング: 5373

コメント

  1. […] Androidアプリで写真の選択or新しく写真を撮ってからプレビューする(http://shinodogg.com/?p=3670)   – 帰りがけにTシャツいただきました! […]

タイトルとURLをコピーしました