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" />

更多关于LifecycleServicehere。

【讨论】:

服务的生命周期与活动片段不同。我想到了这个想法,但由于 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前台服务?

如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?

在前台服务中运行的 ScheduledThreadPoolExecutor 的 poolsize

android studio 从服务中获取 Activity 对象