从服务到活动共享SurfaceView

时间:2018-08-07 06:33:43

标签: android camera android-service surfaceview surface

我有一个由活动启动的后台运行的服务。该服务本身是后台摄像机。该服务尝试启动Camera2并将其写入Media Recorder提供的Surface。

当我获得“活动”提示时,现在我希望具有实时流以及后台录制。到目前为止,我一直在Activity中创建SurfaceView,并在从Activity中创建曲面时将其作为目标传递给Camera2。但是,每次Surface遭到破坏时(即Activity进入后台),我都必须重新初始化Camera2 API。这是解决这个问题的正确方法吗?服务是否可能拥有SurfaceView并将对Surface的引用传递回给Activity,以便它可以显示实时供稿而无需重新初始化Camera设备?

1 个答案:

答案 0 :(得分:0)

不直接; SurfaceView必须存在于应用程序流程中,因为它与应用程序的UI状态紧密相关(而且您已经注意到,每次应用程序在后台运行时,它都会被拆除)。因此它不能存在于服务中。

但是,您可以让服务接收相机帧,然后在前台将其重新发送给应用程序。例如,您可以使用ImageReader从相机读取YUV帧,然后将它们(使用ImageWriter)写入应用程序从其自己的ImageReader(或SurfaceView,如果可以执行下面所述的YV12位)提供的Surface。然后,当应用出现或消失时,无需重新配置相机;该服务可以开始将图像转储到任何地方。

那确实需要应用绘制自己的YUV框架,这很烦人,因为不幸的是,没有要求TextureView或SurfaceView接受YUV_420_888缓冲区。如果您的相机设备支持YV12输出,则可以将其直接写入SurfaceView或TextureView;否则,您可能需要实现一些自定义翻译。最有效的方法是在JNI代码中完成,您可以使用NDK ANativeWindow API从SurfaceView锁定Surface,将其格式设置为YV12,然后将YUV_420_888图像数据写入其中(根据需要转换像素步幅/行步幅)。