如何在Android 11中从另一个前台服务中使用打开的Camera运行前台服务



我现在正在Android 11中的foreground service中测试打开的相机,我对新的Android 11限制有问题:https://developer.android.com/guide/components/foreground-services

伪代码:

//Service1 is started by JobScheduler.
class Service1 extends Service {
...
startForeground(ID_OF_SERVICE1_NOTIFICATION, getService1Notification())
...
//Run another foreground service with open camera
Intent i = new Intent(getApplicationContext(), Service2.class)
ContextCompat.startForegroundService(context, i)
...
}
class Service2 extends Service {
...
startForeground(ID_OF_SERVICE2_NOTIFICATION, getService2Notification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST);
openCamera() // <-- Policy exception
...
}

类Service1由JobSchedulerstartForeground()启动,并向用户显示通知。Service1可以用startForeground()启动(ContextCompat.startForegroundService()(Service2,并向用户显示通知。Service2打开摄像头。用户始终可以看到通知。

清单已编辑:

<service android:name=".service.Service2"
android:foregroundServiceType="camera|microphone"
android:stopWithTask="false"/> 

Service2中编辑starForeground(),带有标志FOREGROUND_SERVICE_TYPE_MANIFEST:(特殊值表示使用清单文件中设置的所有类型(

Logcat:的结果

从后台启动的前台服务无法访问位置/摄像头/麦克风:service.com.example.test/.service.Service2

还尝试了FOREGROUND_SERVICE_TYPE_CAMERA|FOREGROUND_SERVICE_TYPE_MICROPHONE

我希望在为用户启动相机时保持自动化。有办法吗?

据我所知,由于android 11,如果自应用程序进程开始以来用户不可见应用程序,则无法从前台服务自动启动相机。用户必须与应用程序交互才能使用相机。根据文档,这些是应用程序被视为交互的方式,而无需实际打开活动:

  • 服务由系统组件启动
  • 该服务是通过与应用程序小部件交互来启动的
  • 该服务是通过与通知交互来启动的。[注意:交互!仅显示通知是不够的]
  • 该服务是作为PendingIntent启动的,它是从另一个可见的应用程序发送的
  • 该服务由一个应用程序启动,该应用程序是在设备所有者模式下运行的设备策略控制器
  • 该服务由一个提供VoiceInteractionService的应用程序启动。该服务由具有START_ACTIVITIES_FROM_BACKGROUND特权权限的应用程序启动

相关内容

  • 没有找到相关文章

最新更新