MediaRecorder: сбой остановки: -1007 - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь реализовать запись видео со "старой" камерой api (не camera2), и недавно я столкнулся с ошибкой, которую не могу исправить ( Проблема в том, что когда я вызываю метод stop (), чтобы остановить запись, происходит сбой приложения. Start () работает нормально, и я не могу понять, в чем проблема. Приложение имеет все разрешения:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-feature android:name="android.hardware.camera.front" android:required="true"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/>

Класс CameraPreview выглядит следующим образом:

public class CameraHelperOld extends SurfaceView implements SurfaceHolder.Callback {


private final String mVideoPath;
Camera mCamera;
private MediaRecorder mMediaRecorder;

public CameraHelperOld(Context context, String videoPath) {
    super(context);
    try {
        mCamera = Camera.open(0);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mVideoPath = videoPath;

    this.getHolder().addCallback(this);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

        mMediaRecorder = new MediaRecorder();

        CamcorderProfile profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH);

        mCamera.unlock();
        mMediaRecorder.setCamera(mCamera);

        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

        mMediaRecorder.setProfile(profile);

        mMediaRecorder.setOutputFile(mVideoPath);

        mMediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
            @Override
            public void onError(MediaRecorder mr, int what, int extra) {
                Log.d("Error","error");
            }
        });
        mMediaRecorder.setPreviewDisplay(this.getHolder().getSurface());

        try {
            mMediaRecorder.prepare();
            mMediaRecorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    try {
        mMediaRecorder.stop();
    } catch (RuntimeException e) {
        e.printStackTrace();
    }
    mMediaRecorder.reset();
    mMediaRecorder.release();

    mCamera.stopPreview();
    mCamera.release();
}

}

Я вызываю метод Stop () в surfaceDestroyed () - и это определенно не проблема, потому что я вызывал его из разных мест.

Теперь я перепробовал все найденные решения, но ни одно из них не сработало. Может ли кто-нибудь объяснить мне, в чем причина такого поведения?

Кстати, я использую Nexus 5 LG.

Я успешно реализовал запись видео с помощью Camera2 API, но мне нужно приложение для работы со старым Camera API, поскольку мне нужна поддержка KitKat и более старых устройств Android.

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...