2017-07-19 237 views
1

tl; dr我有camera2api的活动和后台服务 - 不知道如何将“流”预览传递给活动视图。android camera2在使用后台服务的情况下的预览面

我知道如何使相机预览活动。我创建了例如SurfaceView在活动布局,并通过它的表面(由这种方式:)

Surface surface = surfaceViewFromLayout.getHolder().getSurface(); 
myCameraObjWhichHandlesCamera2API.open(surface); 

(ofcourse也与代码来设置适当的尺寸)

作为预览目标

CameraDevice.createCaptureSession(List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler) 

问题:但怎么做才能在后台服务工作捕获会话(仍然是可行的我),显示活动预览时,屏幕上?更多内容:我正在编写应用程序制作时间戳 - 每次拍摄照片等。 30秒。相机代码在后台服务。我想有时打开屏幕,并期待进步,也看到相机的当前视图。

主要的事情是,我有两个组成部分 - 活动和后台服务与摄像头,并且不知道如何通过当前的摄像头预览“流”。

  1. 如果我可以将Activity对象从Activity布局传递给后台服务组件,如果Activity通过关闭屏幕来销毁 - Surface也可能被销毁,从而捕获会话。

编辑:但是,从我知道,这是不可能通过组件之间的对象 - 除了parcelable /序列化,但表面是相当复杂的对象?

  • 别通布局的表面到后台服务相机,但创建在后台服务虚设表面(代码下面) - 但如何传递部件之间的“流”,设置在Activity中的SurfaceView。
  • SurfaceTexture dummySurface = new SurfaceTexture(10); dummySurface.setDefaultBufferSize(choosenSize.getWidth(), choosenSize.getHeight()); Surface previewSurface = new Surface(dummySurface);

    // then when creating request, pass this: cameraDevice.createCaptureSession(Arrays.asList(previewSurface, imageReader.getSurface(), stateCallback, null);

    回答

    1

    这里有你可以考虑几种选择。请注意,我没有尝试过任何建筑的这些,所以它可能有我没有想到的其他问题。

    1. 每当您的活动进入前台时,请将Surface从SurfaceView(一旦创建)交给您的服务。然后,该服务需要重新配置摄像头设备以通过创建新的捕捉会话来包含新的Surface。这将导致摄像机输出一个简短的小故障,但因为你正在做的延时,这其实并不重要。表面可以通过粘合剂交叉处理发送。当您的活动进入后台以从捕获请求中移除SurfaceView Surface时,您还必须通知服务。您可以再次重新配置以获取仍然捕获的输出,但是您可以保持会话不变,并且不在捕获请求中包含SurfaceView Surface。

    2. 在活动中使用SurfaceTexture,并使用自定义的GLSurfaceView进行绘制。可以附加独立的SurfaceTexture并从GL上下文中嵌入detached;当被分离时,它仍然可以作为摄像头捕获请求的目标,缓冲区只是在ST连接到GL上下文并且调用updateTexImage()之前不会去任何地方。然后,您的GLSurfaceView需要将SurfaceTexture纹理绘制到全屏四边形。这基本上是你自己的小型TextureView,但是对生命周期有更多的控制。从SurfaceTexture创建Surface,并将其传递给您的服务;那么它可以创建一个捕获会话,但如果它与您的服务不是同一个进程,您可能仍然需要担心Activity进程被拆卸。

    相关问题