有没有办法让 Android 摄像头记录通过多个活动?

Posted

技术标签:

【中文标题】有没有办法让 Android 摄像头记录通过多个活动?【英文标题】:Is there a way to keep Android camera recording going through multiple activities? 【发布时间】:2013-09-20 22:30:17 【问题描述】:

我想做一个应用程序,在应用程序的整个生命周期中记录前置摄像头——从用户启动到终止。

我知道我需要创建一个SurfaceView 并使用MediaRecorder 类来设置录制。我想在Activities 之间传递这个SurfaceView,而不必在每个新的Activity 中初始化它。这样做的目的是不必中断摄像机记录。

这可能吗?我知道我可以按照this 教程中的说明通过相机应用程序进行录制,但我想完全控制MediaRecorder,因此无法使用此选项。

【问题讨论】:

【参考方案1】:

您不能在活动之间传递 SurfaceView,因为它不可打包。因此,如果有活动,摄像头录制会中断。不过,您可以使用片段,将用于记录的代码保留在活动类中,并在导航中不断更改片段。

【讨论】:

感谢您的建议,但我将无法使用此解决方案。我的规范不允许我使用片段而不是活动。我希望录制代码可能用于多个应用程序。编辑:如果第一个活动始终存在,我是否可以在其上存储一个SurfaceView,在Application 类中添加对它的引用,并从可能稍后启动的Activities 引用它? 怎么不允许使用片段?是因为目标 api 级别吗?如果是,您可以使用支持 v4。我认为这可以工作,但是您必须在单独的线程中记录代码,我认为 UI 线程不适用于后台活动。我不确定。 我正在编写更多的 SDK 供其他人在他们的应用程序中使用,因此我无法控制他们是使用片段还是完整的活动。【参考方案2】:

我通过在应用程序的第一个 Activity 中创建一个 SurfaceView 解决了这个问题,如下所示:

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 并确保它不会显示在屏幕上。

然后我将这个SurfaceViewSurfaceHolder 设置为Camera 的预览显示。我还设置了SurfaceHolderSurface作为MediaRecorder的预览显示。

mCamera.setPreviewDisplay(mSurfaceView.getHolder());
// ... other code goes here ...
mMediaRecorder.setCamera(mCamera);
// ... other code goes here ...
mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());

最后,我将CameraMediaRecorder 的实例持久化到Application 的子类中。这确保了SurfaceView 不会被垃圾回收,因为它被在应用程序生命周期期间具有引用的其他对象引用。这让我可以通过多个Activities 在相机上录制,直到我在MediaRecorder 的实例上调用stop() 函数。

((CameraTest) getApplication()).setCamera(mCamera);
((CameraTest) getApplication()).setMediaRecorder(mMediaRecorder);

编辑:不幸的是,这不适用于华硕 Nexus 7。它适用于三星 Galaxy S4。

【讨论】:

以上是关于有没有办法让 Android 摄像头记录通过多个活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在安卓平台打开“前置摄像头”?

有没有办法让 Android 设备充当 NTRIP 客户端?

如何让Android平台像IPC一样实现GB28181前端设备接入

有没有办法打开和关闭前置摄像头的手电筒? [复制]

android应用保活机制

如何同时运行两个函数