C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

カメラのシャッター音を有効/無効にするには, Cameraクラス及びCameraInfoクラスを利用する.
注) 国内キャリアの端末では, シャッター音の有効/無効の制御はできないようである.

シャッター音の有効/無効(API Level 17)

写真を撮影する」を参照して, カメラで写真が撮影できるようにする.
  • src/CameraView.java
    • View#onTouchEventメソッドをオーバーライドする.
      • Camera#takePictureメソッドで, 写真を撮影する.
    注) 引数のshutterをnullにすると, シャッター音が鳴らない.
    • SurfaceHolder.CallbackインタフェースのsurfaceCreatedメソッドをオーバーライドする.
      • Camera#getCameraInfoメソッドで, カメラ情報を取得する.
      • CameraInfo.canDisableShutterSoundを参照して, シャッター音の無効化が可能かチェックする.
      • 無効化が可能な場合, Camera#enableShutterSoundメソッドで, シャッター音を無効化する.
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.CameraInfo;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.hardware.Camera.Size;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.SurfaceHolder;

public class CameraView extends SurfaceView
    implements SurfaceHolder.Callback, PictureCallback, ShutterCallback {
  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(this, null, this);
    }
    return true;
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera = Camera.open(0);
    // カメラ情報の取得
    CameraInfo cameraInfo = new CameraInfo();
    Camera.getCameraInfo(0, cameraInfo);
    // シャッター音の制御可能か?
    if (cameraInfo.canDisableShutterSound) {
      Log.v("Camera", "Shutter sound can be disabled.");
      // シャッター音無効
      if (mCamera.enableShutterSound(false)) {
        Log.v("Camera", "Disable shutter sound");
      }
      else {
        Log.v("Camera", "enableShutterSound failed.");
      }
    }
    else {
      Log.v("Camera", "Shutter sound can't be disabled.");
    }
    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;
  }

  @Override
  public void onShutter() {
    // TODO Auto-generated method stub

  }
}
  • 動作例
1) SHARP SHL22 / Android 4.2.2
 シャッター音の無効化できない.

2) MSI Primo81 / Android 4.4




コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

AD



管理人のみ編集できます