Android-MediaRecorder-应用程序失去了表面

Android-MediaRecorder-应用程序失去了表面,android,video-capture,Android,Video Capture,我首先尝试使用以下内容创建SurfaceView: SurfaceView sv = new SurfaceView(context); // Get a surface surfaceHolder = sv.getHolder(); // tells Android that this surface will have its data constantly // replaced surfaceHolder.addCallback(this); surfaceHolder.setType(

我首先尝试使用以下内容创建SurfaceView:

SurfaceView sv = new SurfaceView(context);
// Get a surface
surfaceHolder = sv.getHolder();
// tells Android that this surface will have its data constantly
// replaced
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);        
wm.addView(sv, params);
然后试着准备录音机:

try {
    camera.unlock();

    mediaRecorder = new MediaRecorder();

    mediaRecorder.setCamera(camera);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setProfile(CamcorderProfile
                .get(CamcorderProfile.QUALITY_HIGH));

    mediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO,
                appName).toString());

    mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

    mediaRecorder.prepare();
} catch (IllegalStateException e) {
    releaseMediaRecorder();
    Log.d(TAG,
        "IllegalStateException preparing MediaRecorder: "
                        + e.getMessage());
    return false;
} catch (IOException e) {
    releaseMediaRecorder();
    Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());

    return false;
}

return true;

但我得到一个错误“应用程序失去了表面”,尽管我可以看到预览正在工作。为什么会这样?

可能的原因是,只有在MediaRecorder实例创建之后,才会完全创建Surface实例


解决方案是将SurfaceView初始化(有问题的第一段代码)放在activity中的onStart()中。它将保证在MediaRecorder初始化之前完成具有所有相应回调的曲面的创建

是的,我确认这种行为。首先,必须使用camera.setPreviewDisplay(holder)和camera.startPreview()初始化相机。在预览曲面中显示摄像头图像后,可以调用camera.unlock()和new MediaRecorder().setCamera(摄像头)。