我想制作一个应用程序,在应用程序的整个生命周期中记录前置摄像头 - 从用户启动它到终止它。
我知道我需要创建一个SurfaceView
并使用MediaRecorder
该类来设置录制。我想SurfaceView
在之间传递它,Activities
而不必在每个新的Activity
. 这样做的目的是不必中断摄像机记录。
这可能吗?我知道我可以通过本教程中描述的相机应用程序进行录制,但我想完全控制,MediaRecorder
因此无法使用此选项。
我想制作一个应用程序,在应用程序的整个生命周期中记录前置摄像头 - 从用户启动它到终止它。
我知道我需要创建一个SurfaceView
并使用MediaRecorder
该类来设置录制。我想SurfaceView
在之间传递它,Activities
而不必在每个新的Activity
. 这样做的目的是不必中断摄像机记录。
这可能吗?我知道我可以通过本教程中描述的相机应用程序进行录制,但我想完全控制,MediaRecorder
因此无法使用此选项。
You can not pass SurfaceView between activities as its not parcelable. So camera recording will get interrupted in case of activities. You can use fragments though, keep code for recording in activity class and on navigation keep changing fragments.
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
这个设置SurfaceView
为预览显示Camera
。我还将 的 设置Surface
为SurfaceHolder
的预览显示MediaRecorder
。
mCamera.setPreviewDisplay(mSurfaceView.getHolder());
// ... other code goes here ...
mMediaRecorder.setCamera(mCamera);
// ... other code goes here ...
mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
Camera
最后,我将and的实例MediaRecorder
保留在Application
. 这确保了SurfaceView
不会被垃圾回收,因为它被在应用程序生命周期期间具有引用的其他对象引用。这使我可以通过多次在相机上录制,Activities
直到我stop()
在MediaRecorder
.
((CameraTest) getApplication()).setCamera(mCamera);
((CameraTest) getApplication()).setMediaRecorder(mMediaRecorder);
编辑:不幸的是,这不适用于华硕 Nexus 7。它确实适用于三星 Galaxy S4。