質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

(後半コード)MediaRecorderインスタンスを再利用する際のIllegalStateExceptionの解決

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 674

giant

score -4

前半のコードと質問のURL

後半のコード

           private void startRecordingVideo() {
        Log.e(TAG,"startRecordingVideo()");
        if (null == mCameraDevice) {
            Log.e(TAG,"return");
            return;
        }
        try {
            Log.e(TAG,"try");
            closePreviewSession();
            setUpMediaRecorder();
            mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
            List<Surface> surfaces = new ArrayList<>();

            Surface recorderSurface = mMediaRecorder.getSurface();
            surfaces.add(recorderSurface);
            mPreviewBuilder.addTarget(recorderSurface);
            mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {


                @Override
                public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                    Log.e(TAG,"CameraCaptureSession:onCongigured");
                    mPreviewSession = cameraCaptureSession;
                    mBackgroundHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            mIsRecordingVideo = true;
                            mMediaRecorder.start();
                        }
                    });
                }

                @Override
                public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                    Log.e(TAG,"onConfigureFailed");
                }
            }, mBackgroundHandler);
        } catch (CameraAccessException | IOException e) {
            e.printStackTrace();
        }

    }



    private void closePreviewSession() {
        Log.e(TAG,"closePreviewSession()");
        if (mPreviewSession != null) {
            mPreviewSession.close();
            mPreviewSession = null;
        }
    }



    private void setUpMediaRecorder() throws IOException {
        Log.e(TAG,"setUpMediaRecorder");
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        if (mNextVideoAbsolutePath == null || mNextVideoAbsolutePath.isEmpty()) {
            //mNextVideoAbsolutePath = getVideoFilePath(this);
            mNextVideoAbsolutePath = getVideoFilePath();
            Log.e(TAG,mNextVideoAbsolutePath);
        }
        mMediaRecorder.setOutputFile(mNextVideoAbsolutePath);
        mMediaRecorder.setVideoEncodingBitRate(10000000);
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        int rotation = windowManager.getDefaultDisplay().getRotation();
        switch (mSensorOrientation) {
            case SENSOR_ORIENTATION_DEFAULT_DEGREES:
                mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
                break;
            case SENSOR_ORIENTATION_INVERSE_DEGREES:
                mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
                break;
        }
        mMediaRecorder.prepare();
    }


    public String getVideoFilePath() {
        Log.e(TAG, "getVideoFilePahy");

        File filePathy;
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/cameraMovie/";
        filePathy = new File(path);
        if (!filePathy.exists()) {
            boolean result = filePathy.mkdir();
            if (result) {
                System.out.println("Success");
            }
        }
        return filePathy.toString() + "/" + System.currentTimeMillis() + ".mp4";
    }


    public void stop(){
        Log.e(TAG,"stop()");
        if (mIsRecordingVideo) {
            //この上の確認のためにあるstopメソッド
            stopRecordingVideo();
        }
    }

    private void stopRecordingVideo() {
        Log.e(TAG,"stopRecordingVideo()");
        mIsRecordingVideo = false;
        //349行目です。
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        mNextVideoAbsolutePath = null;
    }

    @Override
    public void onDestroy() {
        // 削除作業を継続させる
        super.onDestroy();
        Log.e(TAG,"onDestroy()");
        // windowからViewを排除する
        windowManager.removeView(views);

        //onPause()のやつ2つ
        closeCamera();
        stopBackgroundThread();

    }

    private void closeCamera() {
        Log.e(TAG,"closeCamera()");
        try {
            mCameraOpenCloseLock.acquire();
            closePreviewSession();
            if (null != mCameraDevice) {
                mCameraDevice.close();
                mCameraDevice = null;
            }
            if (null != mMediaRecorder) {
                mMediaRecorder.release();
                mMediaRecorder = null;
            }
        } catch (InterruptedException e) {
            throw new RuntimeException("Interrupted while trying to lock camera closing.");
        } finally {
            mCameraOpenCloseLock.release();
        }
    }


    private void stopBackgroundThread() {
        Log.e(TAG,"stopBackgroundThread");
        mBackgroundThread.quitSafely();
        try {
            mBackgroundThread.join();
            mBackgroundThread = null;
            mBackgroundHandler = null;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • 退会済みユーザー

    2017/08/09 09:43

    複数のユーザーから「問題・課題が含まれていない質問」という意見がありました
    teratailでは、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。
    「編集」ボタンから編集を行い、質問の意図や解決したい課題を明確に記述していただくと回答が得られやすくなります。

  • yona

    2017/08/09 09:51 編集

    エラーログが出ている不具合なので、エラーログとエラーログで指定されている箇所前後・関連箇所数行で十分です。あとは回答者が要求すると思いますよ。

    キャンセル

  • fiveHundred

    2017/08/09 09:52

    すいません。コンパイルエラーと勘違いしていました…。ただ、ソースコードが長いと読んでいる人に負担がかかる(あるいはそもそも読んでくれない)ので、printfデバッグなどでエラー箇所を特定して、そのエラーを含んだ短いソースコードを書いて質問する、という形のほうがいいと思います。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる