我现在正在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由JobScheduler
和startForeground()
启动,并向用户显示通知。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特权权限的应用程序启动