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

Expo SDK v51升级后定位前台服务权限未同步至Android Manifest问题

Expo SDK v51升级后ExpoLocation前台服务权限问题解决方法

问题重现

升级Expo SDK至v51后,调用ExpoLocation.startLocationUpdatesAsync触发错误:

[Error: Call to function 'ExpoLocation.startLocationUpdatesAsync' has been rejected.
→ Caused by: Couldn't start the foreground service. Foreground service permissions were not found in the manifest]

已完成用户权限申请并获得授权,但问题在Expo Go和开发构建环境中均存在。当前app.json的Android配置片段:

"android": {
      "adaptiveIcon": {
        "foregroundImage": "./assets/app-icon512.png",
        "backgroundColor": "#ffffff"
      },
      "permissions": [
        "FOREGROUND_SERVICE_LOCATION",
        "FOREGROUND_LOCATION",
        "ACCESS_BACKGROUND_LOCATION",
        "ACCESS_COARSE_LOCATION",
        "ACCESS_FINE_LOCATION",
        "CAMERA",
        "READ_EXTERNAL_STORAGE",
        "WRITE_EXTERNAL_STORAGE"
      ],
    },

解决方法

1. 显式声明前台服务组件

在app.json的android字段下添加androidManifest配置,明确注册位置服务的前台服务类型:

"android": {
  "adaptiveIcon": {
    "foregroundImage": "./assets/app-icon512.png",
    "backgroundColor": "#ffffff"
  },
  "permissions": [
    "FOREGROUND_SERVICE_LOCATION",
    "ACCESS_BACKGROUND_LOCATION",
    "ACCESS_COARSE_LOCATION",
    "ACCESS_FINE_LOCATION",
    "CAMERA",
    "READ_EXTERNAL_STORAGE",
    "WRITE_EXTERNAL_STORAGE"
  ],
  "androidManifest": {
    "application": {
      "service": [
        {
          "name": "expo.modules.location.LocationService",
          "foregroundServiceType": "location",
          "permission": "android.permission.FOREGROUND_SERVICE_LOCATION"
        }
      ]
    }
  }
}

2. 精简权限列表

移除冗余的FOREGROUND_LOCATION权限——Expo SDK v51中该权限已被整合到前台服务的权限逻辑中,无需单独声明。

3. 清理缓存并重建

  • Expo Go环境:执行以下命令清除缓存后重启项目:
npx expo start --clear
  • 开发构建环境:重新生成开发构建包,确保Manifest的变更被正确注入到APK中。

4. 确认权限请求逻辑

调用位置更新前,必须确保已成功获取前台位置权限:

import { Location, PermissionStatus, requestForegroundPermissionsAsync } from 'expo-location';

// 先请求前台位置权限
const permissionResult = await requestForegroundPermissionsAsync();
if (permissionResult.status !== PermissionStatus.GRANTED) {
  console.error("前台位置权限未授权");
  return;
}

// 启动位置更新
await Location.startLocationUpdatesAsync(YOUR_TASK_NAME, {
  // 你的位置配置参数
});

内容的提问来源于stack exchange,提问作者Petr Holoubek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:24:58