CameraのIntent呼び出し - ReDo

2010年12月14日

CameraのIntent呼び出し

Cameraアプリに静止画撮影をお願いするIntentのしきたりについて。

  • Cameraに静止画撮影をお願いするIntentに指定するACTIONは MediaStore.ACTION_IMAGE_CAPTURE。Extra設定無しでは小サイズのBitmapを返す。getExtras().get("data")で返す。
  • MediaStore.EXTRA_OUTPUTにURIを放り込むとそこに書き込む。ContentProviderでMediaStoreに放り込む際には予めinsertしてURIを確保する必要があるが、Xperia2.1では不要。
  • MediaStore.EXTRA_VIDEO_QUALITYに0(low)だとfor MMS、1(high)だとそれ以外の目的なので、大きめサイズが撮影したい際には1をセットしておくのが無難らしい。
  • つまりとりあえずなデモアプリを作成する際には、ExtraなしでIntentサイズ制限にかからない小サイズなBitmapをとってきてImageView#setImageBitmapしてやるのが楽。

以下、続きにコード等を記載。

わん つー どん

【参考URL】
http://achorniy.wordpress.com/2010/04/26/howto-launch-android-camera-using-intents/
http://nowdeveloping.blogspot.com/2010/04/android-intent-to-take-picture.html
http://blog.tappli.com/article/40839753.html
http://mymo.blog8.fc2.com/blog-entry-46.html
http://d.hatena.ne.jp/gabuchan/20101125/1290681748

package test.intentcamera;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;

/**
 * Intent Camera Test
 */
public class Main extends Activity {
    /** log tag */
    private static final String TAG = "IntentCamera";
    /** requestcode : camera */
    private static int REQUEST_CODE_CAMERA = 1;
    /** ImageView */
    private static ImageView previewImage = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // preview ImageView
        previewImage = (ImageView) findViewById(R.id.previewImage);

        findViewById(R.id.cameraButton).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Log.d(TAG, "cameraButton onClick() start");

                // Intent for Camera
                Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(i, REQUEST_CODE_CAMERA);
            }
        });

        findViewById(R.id.clearButton).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Log.d(TAG, "cameraButton onClick() start");
                if (previewImage != null) {
                    previewImage.setImageResource(R.drawable.noimage);
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_CAMERA) {
            if(resultCode == RESULT_OK)
            {
                Toast.makeText(this, "Image Capture Succeeded.", Toast.LENGTH_SHORT).show();
                Bundle extras = data.getExtras();
                if(extras != null)
                {
                    Bitmap bitmap = (Bitmap)extras.get("data");
                    if( (bitmap != null) && (previewImage != null) )
                    {
                        previewImage.setImageBitmap(bitmap);
                    }
                }
            }
            else
            {
                Toast.makeText(this, "Image Capture Failed.", Toast.LENGTH_SHORT).show();
            }
        }
    }

}

コメントする