Camerax 在服务中运行。如何在前台服务中获取生命周期所有者或在没有它的情况下运行?
Posted
技术标签:
【中文标题】Camerax 在服务中运行。如何在前台服务中获取生命周期所有者或在没有它的情况下运行?【英文标题】:Camerax run in service . How to get lifecycleowner or run without it inside a foreground service? 【发布时间】:2020-06-23 02:10:44 【问题描述】:用例:我必须在没有任何活动或片段的服务内后台运行相机
Blocker:新的 camerax 会话绑定到生命周期所有者,但服务没有任何 .那么如何获取此对象或在没有它的情况下运行?
已经尝试过:我可以用 Camera2 库做同样的事情,但我想知道 Camerax 是否有可能,因为 Camera2 api 将来可能会被弃用。 还是谷歌故意试图阻止用户在没有活动的情况下运行相机?
请推荐
【问题讨论】:
medium.com/androiddevelopers/… 测试版 【参考方案1】:您是否尝试过扩展LifecycleService 而不是常规的Service
?为此,您需要在 gradle 文件中添加 androidx.lifecycle:lifecycle-service:2.x.y
作为依赖项(如果您还没有的话)。然后,当您调用 bindToLifecycle
方法时,您只需将 this
作为参数传递,它应该可以工作:
class ExampleService : LifecycleService()
// here should be use case implementation
...
processCameraProvider.bindToLifecycle(this, ...)
(免责声明:没有对此进行测试,所以我不能 100% 确定)。
此外,从 Android 11 开始,您应该添加 following snippet 以使其正常工作:
<manifest>
...
<service ... android:foregroundServiceType="camera" />
更多关于LifecycleService
here。
【讨论】:
服务的生命周期与活动片段不同。我想到了这个想法,但由于 CameraX 使用了活动生命周期观察器,所以无法实现。请让我知道它是否适合您。 我的目标是 android 6 到 9 另请阅读开发者对后台摄像头实施的回答:groups.google.com/a/android.com/g/camerax-developers/c/…【参考方案2】:LifecycleService 对我不起作用,但自定义 ServiceLifeCycleOwner 让工作变得很棒:
class ServiceLifeCycleOwner : LifecycleOwner
private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
init
lifecycleRegistry.currentState = Lifecycle.State.CREATED
fun start()
lifecycleRegistry.currentState = Lifecycle.State.STARTED
fun stop()
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
override fun getLifecycle(): Lifecycle = lifecycleRegistry
然后你可以像这样捕获图像:
fun captureImage(cameraSelector: CameraSelector)
...
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(lifeCycleOwner, cameraSelector, imageCapture)
lifeCycleOwner.start()
...
查看google example如何使用cameraX,感谢google提供如此简单而强大的api!
【讨论】:
以上是关于Camerax 在服务中运行。如何在前台服务中获取生命周期所有者或在没有它的情况下运行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?