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

标签 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(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;

但我收到错误消息“应用程序丢失了表面”,尽管我可以看到预览正在运行。这是为什么?

最佳答案

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

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

关于Android - MediaRecorder - 应用程序失去了表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17030745/

相关文章:

java - 即使使用 SByte 数组也是 "Converting Byte array is obsolete, use SByte array instead"

c++ - 如何判断视频是否在opencv中结束?

iphone - 视频模式下录制的快门声(叮)

java - 迭代 HashMap 的 ArrayList 很困难

android - 在我的应用程序中出现构建错误

python - OpenCV:如何只绘制视频文件的第一帧,然后继续显示整个视频

在特定时间跨度内生成 FFMPEG 缩略图

c++ - 从另一个应用程序获取一个应用程序的 OpenGL 输出

android - 如何在库模块中使用 Android View Binding?

android - 为什么 Android 的 ImageDecoder(在 Pie 中引入)没有公共(public)的 InputStreamSource?