You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDK33升级至SDK34后Foreground Service启动异常修复方案咨询

问题场景

将应用从SDK33升级至SDK34后,进入问卷图片上传页面时抛出异常:

Android.App.ServiceStartNotAllowedExceptionInvoker: 'Starting FGS without a type callerApp=ProcessRecord{3e07c0e 4863:com.OIA.oia_agent.dev/u0a190} targetSDK=34'

这是Android 14(API 34)对前台服务(FGS)的启动规则做了严格限制导致的——必须指定前台服务类型,并声明对应权限。


修改方案

1. UploadProgressService.cs 修改

关键调整:

  • 为Service指定对应场景的前台服务类型(文件上传属于数据同步场景,用TypeDataSync)
  • 补全类继承关系与必填抽象方法

修改后的完整代码:

using Android.App;
using Android.Content;
using Android.OS;
using OIA_Agent.Helpers;
using OIA_Agent.Services.ServiceInterfaces;
using Xamarin.Forms;

namespace OIA_Agent.Droid.Notification
{
    // 指定前台服务类型为数据同步,匹配文件上传场景
    [Service(ForegroundServiceType = ForegroundService.TypeDataSync)]
    public class UploadProgressService : Service // 补全继承Service基类
    {
        private const int ServiceRunningNotifID = 1001; // 补充原代码缺失的通知ID常量
        private string JobNumber;
        private string foregroundChannelId;

        public override void OnCreate()
        {
            base.OnCreate();
        }

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            JobNumber = intent.GetStringExtra("JobNumber");
            foregroundChannelId = intent.GetStringExtra("notificationChannelId");
            
            base.OnStartCommand(intent, flags, startId);
            
            var notification = DependencyService.Get<IProgressNotificationService>()
                .ReturnNotif(foregroundChannelId, 
                    $"{ConstantHelper.Alerts.UploadStarted} {JobNumber}", 
                    $"{ConstantHelper.Alerts.UploadInProgress1}{JobNumber}{ConstantHelper.Alerts.UploadInProgress2}");
            
            StartForeground(ServiceRunningNotifID, notification);
            return StartCommandResult.Sticky;
        }

        public override void OnDestroy()
        {
            base.OnDestroy();
        }

        public override bool StopService(Intent name)
        {
            return base.StopService(name);
        }

        // Service基类要求必须实现的抽象方法
        public override IBinder OnBind(Intent intent)
        {
            return null;
        }
    }
}

2. AndroidManifest.xml 修改

关键调整:

  • 替换通用前台服务权限为具体的FOREGROUND_SERVICE_DATA_SYNC权限
  • 在application节点内显式声明UploadProgressService,并指定前台服务类型

修改后的核心代码片段:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          android:versionCode="46" 
          android:versionName="2.5.2" 
          package="com.OIA.oia_agent.dev" 
          android:installLocation="preferExternal">
    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="34" />
    
    <!-- 替换原通用FOREGROUND_SERVICE权限为具体类型权限 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
    <!-- 保留其他原有权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- ... 其余权限省略 ... -->
    
    <application ...>
        <!-- 保留原有activity、receiver等节点 -->
        
        <!-- 新增UploadProgressService的声明,与代码中指定的类型匹配 -->
        <service android:name=".Notification.UploadProgressService"
                 android:foregroundServiceType="dataSync" />
        
        <!-- 保留原有provider、meta-data等节点 -->
    </application>
</manifest>

额外说明:

  • Android 14不再支持通用的FOREGROUND_SERVICE权限,必须使用对应场景的具体权限
  • 移除无用的INSTANT_APP_FOREGROUND_SERVICE权限(非即时应用无需声明)

注意事项

启动前台服务的时机必须是应用处于前台可见状态(比如用户点击上传按钮后立即启动),Android 14禁止后台无豁免场景下启动前台服务。

内容的提问来源于stack exchange,提问作者Yajush Pratap Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:25:56