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

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

ただいまの
回答率

89.99%

撮影開始ボタンと、停止ボタンを押してなくても画像のようなエラーが出る

受付中

回答 0

投稿 編集

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

giant

score -4

撮影開始ボタンと、停止ボタンを押したときに、startRecordingVideo();や、stopRecordingVideo();を呼び出すコードを書きます。
ここを書いていないのに、画像のようなエラーが出ます。
このActivityでの動画撮影のサンプルを元に、Serviceで撮影できるアプリを作りたいです。:AtivityのURL

public class MyService7 extends Service {
private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice cameraDevice) {
            Log.d(TAG, "onOpened");
            mCameraDevice = cameraDevice;
            startPreview();
            mCameraOpenCloseLock.release();
            //ここでクラス変数に値を入れて、その値が、何かで、これを呼ぶかどうかを決める

            Log.e(TAG, "firstOpend");
            startRecordingVideo();

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


        @Override
        public void onDisconnected(@NonNull CameraDevice cameraDevice) {
            Log.e(TAG,"onDisConnected");
            mCameraOpenCloseLock.release();
            cameraDevice.close();
            mCameraDevice = null;
        }

        @Override
        public void onError(@NonNull CameraDevice cameraDevice, int error) {
            Log.e(TAG,"onError");
            mCameraOpenCloseLock.release();
            cameraDevice.close();
            mCameraDevice = null;
        }
    };

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




    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
        startBackgroundThread();
        openCamera();
        return super.onStartCommand(intent, flags, startId);
    }


////////////////////OnCLick()
ここで、撮影開始ボタンと、停止ボタンを押したときに、startRecordingVideo();や、stopRecordingVideo();を呼び出すコードを書きます。
ここを書いていないのに、画像のようなエラーが出ます。



    @SuppressWarnings("MissingPermission")
    private void openCamera() {
        Log.d(TAG,"openCamera");
        CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);

        try {
            Log.d(TAG, "tryAcquire");
            if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
                throw new RuntimeException("Time out waiting to lock camera opening.");
            }
            String cameraId = manager.getCameraIdList()[0];
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
            StreamConfigurationMap map = characteristics
                    .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            mSensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
            if (map == null) {
                throw new RuntimeException("Cannot get available preview/video sizes");
            }

            mVideoSize = chooseVideoSize(map.getOutputSizes(MediaRecorder.class));
            mMediaRecorder = new MediaRecorder();
            manager.openCamera(cameraId, mStateCallback, null);

        } catch (CameraAccessException e) {
            Log.e(TAG, "CameraAccessException e");
        }
    }



    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 startPreview() {
        Log.d(TAG,"startPreview");
        if (null == mCameraDevice) {
            return;
        }
        closePreviewSession();
    }


    //もう一度closePreviewSession()が呼ばれる
    private void setUpMediaRecorder() throws IOException {
        Log.e(TAG,"setUpMediaRecorder");

        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        if (mNextVideoAbsolutePath == null || mNextVideoAbsolutePath.isEmpty()) {
            mNextVideoAbsolutePath = getVideoFilePathy();
            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();
    }




    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");
                    mMediaRecorder.start();
                    mIsRecordingVideo = true;
                    //やっぱここでか?
                    //ここでクラス変数に値を入れて、その値が、何かで、これを呼ぶかどうかを決める

                    Timer mTimer = new Timer();
                    handler = new Handler();
                    mTimer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            // mHandlerを通じてUI Threadへ処理をキューイング
                            handler.post(new Runnable() {
                                public void run() {

                                    mMediaRecorder.start();
                                }
                            });
                        }
                    }, 10000, 10000);
//                       //Activityの参考にしたコード
//                       getActivity().runOnUiThread(new Runnable() {
//                        @Override
//                        public void run() {
//                            // UI
//                            mButtonVideo.setText(R.string.stop);
//                            mIsRecordingVideo = true;
//
//                            // Start recording
//                            mMediaRecorder.start();
//                        }
//                    });
                }

                @Override
                public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                  //省略
                }
            }, mBackgroundHandler);
        } catch (CameraAccessException | IOException e) {
            e.printStackTrace();
        }
    }

    private void stopRecordingVideo() {
        Log.e(TAG,"stopRecordingVideo");
        mIsRecordingVideo = false;
        try{
            mMediaRecorder.stop();
            mMediaRecorder.reset();
        }catch(RuntimeException stopException){

        }
        mNextVideoAbsolutePath = null;
        startPreview();
    }
}


イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2017/08/10 09:35

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

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

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

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