最終更新:
moonlight_aska 2014年11月03日(月) 21:38:14履歴
カメラのシャッター音を有効/無効にするには, Cameraクラス及びCameraInfoクラスを利用する.
注) 国内キャリアの端末では, シャッター音の有効/無効の制御はできないようである.
注) 国内キャリアの端末では, シャッター音の有効/無効の制御はできないようである.
「写真を撮影する」を参照して, カメラで写真が撮影できるようにする.
シャッター音の無効化できない.

2) MSI Primo81 / Android 4.4

- src/CameraView.java
- View#onTouchEventメソッドをオーバーライドする.
- Camera#takePictureメソッドで, 写真を撮影する.
- View#onTouchEventメソッドをオーバーライドする.
- 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
}
}
- 動作例
シャッター音の無効化できない.

2) MSI Primo81 / Android 4.4

コメントをかく