有没有办法让 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
并确保它不会显示在屏幕上。
然后我将这个SurfaceView
的SurfaceHolder
设置为Camera
的预览显示。我还设置了SurfaceHolder
的Surface
作为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
在相机上录制,直到我在MediaRecorder
的实例上调用stop()
函数。
((CameraTest) getApplication()).setCamera(mCamera);
((CameraTest) getApplication()).setMediaRecorder(mMediaRecorder);
编辑:不幸的是,这不适用于华硕 Nexus 7。它适用于三星 Galaxy S4。
【讨论】:
以上是关于有没有办法让 Android 摄像头记录通过多个活动?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法让 Android 设备充当 NTRIP 客户端?