1

最初に、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;

しかし、プレビューが機能していることを確認できるにもかかわらず、「アプリケーションが表面を失いました」というエラーが表示されます。何故ですか?

4

1 に答える 1

2

考えられる理由は、MediaRecorder インスタンスが作成された後にのみ、Surface インスタンスが完全に作成されることです。

解決策は、SurfaceView の初期化 (問題のコードの最初のフラグメント) をアクティビティの onStart() に配置することです。MediaRecorder の初期化前に、対応するすべてのコールバックを使用した Surface の作成が完了することが保証されます。

于 2013-08-11T09:55:33.973 に答える