Sai*_*aif 15 foreground-service android-workmanager android-14
我已经使用 WorkManager 实现了 Foreground Service,它在 API 级别 33 之前都可以正常工作。由于在 API 级别 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="dataSync"/>
Run Code Online (Sandbox Code Playgroud)
内部工人:
setForegroundAsync(
ForegroundInfo(
NOTIFICATION_ID,
getNotification(),
ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
)
)
Run Code Online (Sandbox Code Playgroud)
出现此错误
java.lang.IllegalArgumentException: foregroundServiceType 0x00000001 不是android.os.Parcel.createException(Parcel.java:处 android.os.Parcel.createExceptionOrNull(Parcel.java:3015) 处清单文件的服务元素中 foregroundServiceType 属性 0x00000000 的子集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) ...
我尝试到处做一些改变,但没有任何效果。
Šem*_*vić 14
感谢@sebastian,当应用程序中没有使用服务,但使用了 WorkManager 时,我得到了这个异常的正确答案。完整的答案是添加到AndroidManifest.xml
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
tools:node="merge" />
Run Code Online (Sandbox Code Playgroud)
foregroundServiceType还要根据为该服务定义的权限在同一文件中添加适当的权限。在这种情况下,添加权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
Run Code Online (Sandbox Code Playgroud)
要调用startForegroundAsync,请按以下方式创建 ForegroundInfo:
ForegroundInfo foregroundInfo;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
foregroundInfo = new ForegroundInfo(notificationId, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC);
} else {
foregroundInfo = new ForegroundInfo(notificationId, notification);
}
setForegroundAsync(foregroundInfo);
Run Code Online (Sandbox Code Playgroud)
尝试添加
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
tools:node="merge" />
Run Code Online (Sandbox Code Playgroud)
到清单。
来源:文档
错误消息表明您用于调用服务的 foregroundServiceType 未在 Manifest 中声明。您似乎已在清单中将服务类型声明为“mediaPlayback”,并尝试将其启动为“dataSync”。您还可以为您的服务定义多个foregroundServiceType,并在启动服务时使用其中之一,具体取决于您启动服务的用例。要在声明中提供多种类型,您可以用管道 (|) 符号分隔所有类型。尝试按如下方式更改代码,或者删除 mediaPlayback(如果不需要)。
<service
android:name=".services.DownloadService"
android:exported="false"
android:enabled="true"
tools:node="merge"
android:foregroundServiceType="dataSync|mediaPlayback"/>
Run Code Online (Sandbox Code Playgroud)
参考:https://developer.android.com/about/versions/14/changes/fgs-types-required
| 归档时间: |
|
| 查看次数: |
3393 次 |
| 最近记录: |