Androidプログラマへの道 〜 Moonlight 明日香 〜 - カメラ解像度を設定する
カメラの解像度を設定するには, カメラパラメータ(Camera.Parameters)を使用する.

解像度の設定

写真を撮影する」を参照して, カメラで写真を撮影できるようにする.
  • src/CameraView.java
    • Camera#getParametersメソッドで, Camera.Parametersのインスタンスを取得する.
    • Camera.Parameters#getSupportedPictureSizesメソッドで, サポートしているサイズを取得する.
    • Camera.Parameters#setPictureSizeメソッドで, 640x480を設定する.
    • Camera#setParametersメソッドで, Camera.Parametersを設定する.
    • プレビューサイズを変更する場合は, Camera.Parameters#getSupportedPreviewSizes/setPreviewSizeメソッドを使用する.
package com.moonlight_aska.android.camera01;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraView extends SurfaceView
    implements SurfaceHolder.Callback, PictureCallback {
  private Camera mCamera = null;
  private static final String SDCARD_FOLDER = "/sdcard/CameraSample/";

  public CameraView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    SurfaceHolder holder = getHolder();
    holder.addCallback(this);
    // holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // API Level 11で廃止予定に
    // 保存用フォルダ作成
    File dirs = new File(SDCARD_FOLDER);
    if(!dirs.exists()) {
      dirs.mkdir();
    }
  }

  @Override
  public void onPictureTaken(byte[] data, Camera camera) {
    // TODO Auto-generated method stub
    SimpleDateFormat date = new SimpleDateFormat("yyyyMMdd_kkmmss");
    String datName = "P" + date.format(new Date()) + ".jpg";
    try {
      // データ保存
      savePhotoData(datName, data);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      if(mCamera != null) {
        mCamera.release();
        mCamera = null;
      }
    }
    // プレビュー再開
    mCamera.startPreview();
  }

  private void savePhotoData(String datName, byte[] data) throws Exception {
    // TODO Auto-generated method stub
    FileOutputStream outStream = null;

    try {
      outStream = new FileOutputStream(SDCARD_FOLDER + datName);
      outStream.write(data);
      outStream.close();
    } catch (Exception e) {
      if(outStream != null) {
        outStream.close();
      }
      throw e;
    }
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    if(event.getAction() == MotionEvent.ACTION_DOWN) {
      // シャッターを切る
      mCamera.takePicture(null, null, this);
    }
    return true;
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera = Camera.open();
    // パラメータ取得
    Camera.Parameters params = mCamera.getParameters();
    // サポートサイズ取得
    List< Size > sizeList = params.getSupportedPictureSizes();
    for (int i=0; i < sizeList.size(); i++) {
      Log.v("CameraPictureSize", "Size = " + sizeList.get(i).width + "x" + sizeList.get(i).height);
    }
    // サイズ:640x480に設定
    params.setPictureSize(640, 480);
    // パラメータ設定
    mCamera.setParameters(params);
    try {
      mCamera.setPreviewDisplay(holder);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // TODO Auto-generated method stub
    mCamera.stopPreview();
    // プレビュー画面のサイズ設定
    Camera.Parameters params = mCamera.getParameters();
    List<Size> previewSizes = params.getSupportedPreviewSizes();
    Size size = previewSizes.get(0);
    params.setPreviewSize(size.width, size.height);
    mCamera.setParameters(params);
    // プレビュー開始
    mCamera.startPreview();
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
  }
}
  • 動作例
端末:SHARP SHL-22 / Android 4.2.2
1) サポートサイズ

注) SHL-22では, サポートしていないはずの320x240でも撮影できた.

2) 撮影した写真


3) 写真の属性