我已经使用 WorkManager 实现了 Foreground Service,它在 API Level 33 之前都可以正常工作。由于在 API Level 34 中必须指定 foregroundServiceType,所以我在 Worker 和 Manifest 中指定了它,但收到了此错误。
AndroidManifest.xml
所需权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<service
android:name=".services.DownloadService"
android:exported="false"
android:enabled="true"
tools:node="merge"
android:foregroundServiceType="mediaPlayback"/>
内部工人:
setForegroundAsync(
ForegroundInfo(
NOTIFICATION_ID,
getNotification(),
ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
)
)
出现此错误
java.lang.IllegalArgumentException:foregroundServiceType 0x00000001 不是 foregroundServiceType 属性 0x00000000 的子集 清单文件的服务元素位于 android.os.Parcel.createExceptionOrNull(Parcel.java:3015)
在 android.os.Parcel.createException(Parcel.java:2995)
在 android.os.Parcel.readException(Parcel.java:2978)
在 android.os.Parcel.readException(Parcel.java:2920)
在 android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:6079) 在 android.app.Service.startForeground(Service.java:797) ...
我试着到处做一些改变,但没有任何效果。
错误消息表明您用于调用服务的 foregroundServiceType 未在 Manifest 中声明。您似乎已在清单中将服务类型声明为“mediaPlayback”,并尝试将其启动为“dataSync”。您还可以为您的服务定义多个foregroundServiceType,并在启动服务时使用其中之一,具体取决于您启动服务的用例。要在声明中提供多种类型,您可以用管道 (|) 符号分隔所有类型。尝试按如下方式更改代码或删除 mediaPlayback(如果不需要)。
<service
android:name=".services.DownloadService"
android:exported="false"
android:enabled="true"
tools:node="merge"
android:foregroundServiceType="dataSync|mediaPlayback"/>
参考:https://developer.android.com/about/versions/14/changes/fgs-types-required