help!! Androidアプリ作成-静止画&動画撮影

397 views
Skip to first unread message

南須原アナスタシア

unread,
Aug 2, 2016, 10:55:58 AM8/2/16
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は省略しました。
Reply all
Reply to author
Forward
0 new messages