我想制作一个应用程序,在应用程序的整个生命周期中记录前置摄像头 - 从用户启动到终止它的时间。
我知道我需要创建SurfaceView
并使用MediaRecorder
类来设置录制。我想在SurfaceView
之间传递此Activities
,而不必在每个新Activity
中对其进行初始化。这样做的目的是不必中断摄像机录制。
这可能吗?我知道我可以通过this教程中描述的相机应用程序进行录制,但我想完全控制MediaRecorder
,因此无法使用此选项。
答案 0 :(得分:1)
您无法在活动之间传递SurfaceView,因为它不可分区。因此,如果活动,摄像机录制将被中断。您可以使用片段,保留用于在活动类和导航中记录的代码,不断更改片段。
答案 1 :(得分:0)
我通过在应用程序的第一个SurfaceView
中创建Activity
来解决此问题,如下所示:
mSurfaceView = new SurfaceView(MainActivity.this);
ViewGroup vg = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
mSurfaceView.setLayoutParams(new LinearLayout.LayoutParams(1, 1));
mSurfaceView.setPadding(-1, -1, 0, 0);
vg.addView(mSurfaceView);
我将视图添加到活动的主ViewGroup
,并确保它不会显示在屏幕上。
然后我将此SurfaceHolder
的{{1}}设置为SurfaceView
的预览显示。我还将Camera
的{{1}}设置为Surface
的预览显示。
SurfaceHolder
最后,我在MediaRecorder
的子类中保留了mCamera.setPreviewDisplay(mSurfaceView.getHolder());
// ... other code goes here ...
mMediaRecorder.setCamera(mCamera);
// ... other code goes here ...
mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
和Camera
的实例。这确保了MediaRecorder
不会被垃圾收集,因为它被其他对象引用,这些对象在应用程序生命周期的持续时间内具有引用。这允许我通过多个Application
在相机上进行录制,直到我在SurfaceView
的实例上调用Activities
函数。
stop()
编辑:不幸的是,这对华硕Nexus 7无效。它可以在三星Galaxy S4上运行。