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

Android 14(targetSdkVersion=34)前台服务启动崩溃问题求助

Android 14 前台服务启动崩溃修复方案

问题描述

应用在Android 13及以下版本运行正常,升级至Android 14(targetSdkVersion设为34)后启动BleAppService时崩溃,抛出SecurityException。

崩溃日志(中文翻译)

java.lang.RuntimeException: 无法启动服务 com.example.bleapp.service.BleAppService@1d05078,Intent { cmp=com.example.bleapp/.service.BleAppService }: java.lang.SecurityException: 启动类型为connectedDevice的前台服务,调用者应用=ProcessRecord{718b5ad 5016:com.example.bleapp/u0a356} targetSDK=34 需要权限:必须拥有所有以下权限(allOf=true)[android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE],且拥有至少一个以下权限(allOf=false)[android.permission.BLUETOOTH_ADVERTISE, android.permission.BLUETOOTH_CONNECT, android.permission.BLUETOOTH_SCAN, android.permission.CHANGE_NETWORK_STATE, android.permission.CHANGE_WIFI_STATE, android.permission.CHANGE_WIFI_MULTICAST_STATE, android.permission.NFC, android.permission.TRANSMIT_IR, android.permission.UWB_RANGING, USB设备, USB附件]
  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4839)
  at android.app.ActivityThread.-$$Nest$mhandleServiceArgs(未知来源:0)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2289)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loopOnce(Looper.java:205)
  at android.os.Looper.loop(Looper.java:294)
  at android.app.ActivityThread.main(ActivityThread.java:8177)
  at java.lang.reflect.Method.invoke(原生方法)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
Caused by: java.lang.SecurityException: 启动类型为connectedDevice的前台服务,调用者应用=ProcessRecord{718b5ad 5016:com.example.bleapp/u0a356} targetSDK=34 需要权限:必须拥有所有以下权限(allOf=true)[android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE],且拥有至少一个以下权限(allOf=false)[android.permission.BLUETOOTH_ADVERTISE, android.permission.BLUETOOTH_CONNECT, android.permission.BLUETOOTH_SCAN, android.permission.CHANGE_NETWORK_STATE, android.permission.CHANGE_WIFI_STATE, android.permission.CHANGE_WIFI_MULTICAST_STATE, android.permission.NFC, android.permission.TRANSMIT_IR, android.permission.UWB_RANGING, USB设备, USB附件]
  at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)
  at android.os.Parcel.createException(Parcel.java:3041)
  at android.os.Parcel.readException(Parcel.java:3024)
  at android.os.Parcel.readException(Parcel.java:2966)
  at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:6761)
  at android.app.Service.startForeground(Service.java:775)
  at com.example.bleapp.service.BleAppService.onStartCommand(BleAppService.kt:28)
  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4821)
  at android.app.ActivityThread.-$$Nest$mhandleServiceArgs(未知来源:0)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2289)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loopOnce(Looper.java:205)
  at android.os.Looper.loop(Looper.java:294)
  at android.app.ActivityThread.main(ActivityThread.java:8177)

问题原因

Android 14对前台服务权限做了细分,当启动类型为connectedDevice的前台服务时,必须满足两个条件:

  1. 声明android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE权限
  2. 持有至少一个与连接设备相关的权限(比如BLE的BLUETOOTH_CONNECT)

修复步骤

1. 在AndroidManifest.xml中声明前台服务权限

在<manifest>标签下添加:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />

该权限属于正常权限,无需动态申请。

2. 确保已获取对应功能的必要权限

以BLE为例,需要在Manifest中声明相关权限:

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- 若需要广播则添加 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />

其中BLUETOOTH_CONNECT、BLUETOOTH_SCAN属于危险权限,需要在运行时动态申请。

3. 确认前台服务类型配置

  • 在Manifest的<service>标签中指定前台服务类型:
<service
    android:name=".service.BleAppService"
    android:foregroundServiceType="connectedDevice"
    ...>
</service>
  • 或者在调用startForeground()时指定类型(适配Android 12+):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    startForeground(NOTIFICATION_ID, notification, Service.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE)
} else {
    startForeground(NOTIFICATION_ID, notification)
}

内容的提问来源于stack exchange,提问作者Ajith M A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:55:56