我现在正在测试Android 11中前台服务下的相机开启,但是我遇到了新的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
...
}
使用 JobScheduler
启动 Service1,并使用 startForeground()
显示通知给用户。Service1 可以使用 ContextCompat.startForegroundService()
启动 Service2,也可以向用户显示通知。 Service2 打开相机。用户始终可以看到通知。
清单文件已编辑:
<service android:name=".service.Service2"
android:foregroundServiceType="camera|microphone"
android:stopWithTask="false"/>
使用 FOREGROUND_SERVICE_TYPE_MANIFEST
标志在 Service2
中编辑 starForeground()
方法,它是一个特殊的值,表示使用清单文件中设置的所有类型。
Logcat
的结果:
后台启动的前台服务无法访问位置/相机/麦克风:服务 com.example.test/.service.Service2
还尝试了 FOREGROUND_SERVICE_TYPE_CAMERA|FOREGROUND_SERVICE_TYPE_MICROPHONE
。
我希望保留用户自动启动相机的功能,有什么办法吗?
FOREGROUND_SERVICE_TYPE_MANIFEST
,你尝试过使用FOREGROUND_SERVICE_TYPE_CAMERA|FOREGROUND_SERVICE_TYPE_MICROPHONE
吗? - CommonsWareFOREGROUND_SERVICE_TYPE_CAMERA|FOREGROUND_SERVICE_TYPE_MICROPHONE
的行为与FOREGROUND_SERVICE_TYPE_MANIFEST
相同。我已经尝试过了。 - t0m