南須原アナスタシア
unread,Aug 2, 2016, 10:55:58 AM8/2/16Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to 日本Androidの会
はじめまして。新参の者です。
現在私はAndroid studioでカメラアプリを作成しています。機能は以下のようなものです。
①アプリ起動でプレビュー表示
②プレビュー画面下部に静止画撮影のボタンとその隣に動画撮影のボタン(トグルボタン)が設置されている。
③静止画撮影ボタン押下時にAFして撮影、保存。
④動画撮影ボタン押下時、ボタンがONになり動画撮影開始。
⑤動画撮影時に動画撮影ボタンを押下時に動画撮影を停止し、保存する。
このような感じで作成中です。現在③までは作成が終わり、動画機能の作成に入ったのですがここからわからなくなってしまいました。
静止画撮影はいろいろなサイトであったサンプルコードを参考にしなが
ら組んだのですが、静止画撮影と動画撮影の機能を同時に実装したようなサンプルコードが発見できずどのように動画機能を撮影機能と同居させてコードを組めばいいかがわからなくなってしまい、お助けいただきたくこちらに参りました。以下にMainActivityのソースコードをきさいしますので、是非ご助言お願い致します。
public class MainActivity extends Activity {
private SurfaceView mySurfaceView;
private Camera camera;
private static final String TAG = "log";
MediaRecorder recorder;
boolean recoding = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
Button shooting = (Button) findViewById( R.id.button1 );
shooting.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
if (camera != null) {
camera.autoFocus( autoFocusCallBack );
}
}
} );
ToggleButton btn = (ToggleButton) findViewById(R.id.recbtn);
btn.setOnCheckedChangeListener(new CompoundButtton.OnheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
//ここからスイッチをONにした場合の処理
}
});
mySurfaceView = (SurfaceView) findViewById( R.id.surface_view );
SurfaceHolder holder = mySurfaceView.getHolder();
holder.addCallback( callback );
File dirs = new File( "storage" );
if (!dirs.exists()) {
dirs.mkdir();
}
}
private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
camera = Camera.open();
Camera.Parameters param = camera.getParameters();
List<Camera.Size> ls = param.getSupportedPictureSizes();
Camera.Size pictSize = ls.get(0);
param.setPictureSize(pictSize.width, pictSize.height);
Log.v(TAG,"pis"+pictSize.width);
Log.v(TAG,"pis"+pictSize.height);
camera.setParameters(param);
try {
camera.setPreviewDisplay( surfaceHolder );
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
Log.v( TAG, "SrfvSize=" + format );
Log.v( TAG, "SrfvSize=" + width );
Log.v( TAG, "SrfvSize=" + height );
camera.startPreview();
camera.setDisplayOrientation( 90 );
Camera.Parameters param = camera.getParameters();
//カメラのサポートしているプレビューサイズ
List<Camera.Size> ls = param.getSupportedPreviewSizes();
//プレビュー領域のサイズを計算後適切なサイズをセット
Camera.Size optimalSize = getOptimalPreviewSize( ls, width, height );
param.setPreviewSize( optimalSize.width, optimalSize.height );
Log.v( TAG, "preWidth=" + optimalSize.width );
Log.v( TAG, "preHeight=" + optimalSize.height );
param.setRotation(90);
camera.setParameters(param);
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
camera.startPreview();
camera.release();
camera = null;
}
};
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) h / w;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs( ratio - targetRatio ) > ASPECT_TOLERANCE) continue;
if (Math.abs( size.height - targetHeight ) < minDiff) {
optimalSize = size;
minDiff = Math.abs( size.height - targetHeight );
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs( size.height - targetHeight ) < minDiff) {
optimalSize = size;
minDiff = Math.abs( size.height - targetHeight );
}
}
}
return optimalSize;
}
private Camera.AutoFocusCallback autoFocusCallBack = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean b, Camera camera) {
camera.takePicture( null, null, jpgPictureCallback );
}
};
private final Camera.PictureCallback jpgPictureCallback =
new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
if (data == null) {
return;
}
String saveDir = Environment.getExternalStorageDirectory().getPath() + "/test";
Log.i(TAG,"check:"+Environment.getExternalStorageDirectory().getPath());
File file = new File(saveDir);
if (!file.exists()) {
if (!file.mkdir()) {
Log.e("Debug", "Make Dir Error");
}
}
Calendar cal = Calendar.getInstance();
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String imgPath = saveDir + "/" + sf.format(cal.getTime()) + ".jpg";
FileOutputStream fos;
try {
fos = new FileOutputStream(imgPath, true);
fos.write(data);
fos.close();
registAndroidDB(imgPath);
} catch (Exception e) {
}
camera.startPreview();
}
};
private void registAndroidDB(String path) {
ContentValues values = new ContentValues();
ContentResolver contentResolver = MainActivity.this.getContentResolver();
values.put( MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put("_data", path);
contentResolver.insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
}
※importは省略しました。