カメラで静止画を撮影してファイルに保存する方法

前回「アプリケーションからカメラを起動して静止画を取得する方法」 ではインテントを利用してカメラを起動して静止画を撮影する方法をみました。

そこでは撮影した結果は Bitmap オブジェクトとして画像を取得しました。

ここではそれをファイルに保存する方法を示します。

Bitmap オブジェクトを自分でファイルに書き出すのではなく、撮影したあと自動的にファイルに保存をする仕組みがありますので、それを利用します。

カメラの撮影画像のファイルへの保存

MediaStore.ACTION_IMAGE_CAPTURE インテントのエクストラデータとして、MediaStore.EXTRA_OUTPUT をキーとしてファイルの URI を渡すと、 静止画像を撮影後そこに画像を保存します。

このためアプリケーション開発者はファイルに Bitmap オブジェクトをシリアライズするなどして書き出すという必要がありません。

コード例は次のようになります。

package com.keicode.android.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Calendar;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class CameraTest1Activity extends Activity {
	
	static final int REQUEST_CAPTURE_IMAGE = 100;
	
	Button button1;
	ImageView imageView1;
	File picFile;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		findViews();
		setListeners();
	}
	
	protected void findViews(){
		button1 = (Button)findViewById(R.id.button1);
		imageView1 = (ImageView)findViewById(R.id.imageView1);
	}

	protected String getPicFileName(){
		Calendar c = Calendar.getInstance();
		String s = c.get(Calendar.YEAR) 
			+ "_" + (c.get(Calendar.MONTH)+1)
			+ "_" + c.get(Calendar.DAY_OF_MONTH)
			+ "_" + c.get(Calendar.HOUR_OF_DAY)
			+ "_" + c.get(Calendar.MINUTE)
			+ "_" + c.get(Calendar.SECOND)
			+ ".jpg";
		return s;
	}
	
	protected void setListeners(){
		button1.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				picFile = new File(
					Environment.getExternalStorageDirectory(),
					getPicFileName());
				Intent intent = new Intent(
					MediaStore.ACTION_IMAGE_CAPTURE);

				intent.putExtra(
					MediaStore.EXTRA_OUTPUT, 
					Uri.fromFile(picFile));
				
				startActivityForResult(
					intent, 
					REQUEST_CAPTURE_IMAGE);
			}
		});
	}

	@Override
	protected void onActivityResult(
		int requestCode, 
		int resultCode, 
		Intent data) {
		
		if(REQUEST_CAPTURE_IMAGE == requestCode 
			&& resultCode == Activity.RESULT_OK ){
			try {
				FileInputStream in = new FileInputStream(picFile);
				BitmapFactory.Options options 
					= new BitmapFactory.Options();
				options.inSampleSize = 10;
				Bitmap capturedImage 
					= BitmapFactory.decodeStream(
						in,
						null,
						options);
				imageView1.setImageBitmap(capturedImage);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
		}
	}

}

尚、ここで定義した getPicFileName メソッドは撮影時刻からファイル名を作っています。

海外旅行をする人などを考慮に入れると、ローカル時間だけでは写真の撮影時刻の並びがおかしくなる場合がありますので、実際のアプリケーション開発時には注意してください。

タイムゾーンを考慮する場合に "Java 入門 - カレンダーとタイムゾーンの利用" をみてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門