foregroundServiceType 0x00000001 不是清单文件的服务元素中 foregroundServiceType 属性 0x00000000 的子集

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)


seb*_*ian 8

尝试添加

<service
  android:name="androidx.work.impl.foreground.SystemForegroundService"
  android:foregroundServiceType="dataSync"
  tools:node="merge" />
Run Code Online (Sandbox Code Playgroud)

到清单。

来源:文档


Aji*_*ana 1

错误消息表明您用于调用服务的 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