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

求助:使用FusedLocationProviderClient无法在地图显示用户移动位置

无法获取实时位置的排查与修复方案

针对你使用FusedLocationProviderClient结合Service、BroadcastReceiver实现Maps Activity实时位置更新却无法获取位置的问题,按以下步骤排查修复:

1. 权限配置与动态申请

  • Manifest权限:确保在AndroidManifest.xml中声明必要权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Android 10+ 后台位置更新需要 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- 前台服务权限(Android 8.0+) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
  • 动态权限申请:在启动Service前,必须在Maps Activity中动态申请权限,示例代码:
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1001;

private void requestLocationPermissions() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_BACKGROUND_LOCATION},
                LOCATION_PERMISSION_REQUEST_CODE);
    } else {
        // 权限已授予,启动位置服务
        startService(new Intent(this, LocationUpdateService.class));
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startService(new Intent(this, LocationUpdateService.class));
        }
    }
}

2. 修复LocationCallback中的广播发送逻辑

你的Service代码中没有实现广播发送逻辑,导致Maps Activity无法收到位置数据。修改LocationCallback:

locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(@NonNull LocationResult locationResult) {
        super.onLocationResult(locationResult);
        for (Location location : locationResult.getLocations()) {
            Log.d(TAG, "Location Updated: " + location.getLatitude() + ", " + location.getLongitude());
            // 发送广播给Maps Activity
            Intent intent = new Intent("com.your.package.LOCATION_UPDATE");
            intent.putExtra("latitude", location.getLatitude());
            intent.putExtra("longitude", location.getLongitude());
            sendBroadcast(intent);
        }
    }
};

3. Maps Activity中注册BroadcastReceiver

在Maps Activity中注册广播接收器,接收位置更新:

private BroadcastReceiver locationReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("com.your.package.LOCATION_UPDATE".equals(intent.getAction())) {
            double lat = intent.getDoubleExtra("latitude", 0.0);
            double lng = intent.getDoubleExtra("longitude", 0.0);
            // 更新地图上的用户位置
            LatLng userLocation = new LatLng(lat, lng);
            // 示例:移动地图相机或更新标记
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 15));
        }
    }
};

@Override
protected void onResume() {
    super.onResume();
    // 注册广播
    IntentFilter filter = new IntentFilter("com.your.package.LOCATION_UPDATE");
    registerReceiver(locationReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    // 注销广播
    unregisterReceiver(locationReceiver);
}

4. 升级为前台Service(Android 8.0+)

普通后台Service在Android 8.0+会被系统限制,需要改为前台Service,在onCreate中添加:

@Override
public void onCreate() {
    super.onCreate();
    // ... 原有代码 ...

    // 前台Service通知
    NotificationChannel channel = new NotificationChannel("LOCATION_CHANNEL", "位置更新", NotificationManager.IMPORTANCE_LOW);
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    if (manager != null) {
        manager.createNotificationChannel(channel);
    }

    Notification notification = new NotificationCompat.Builder(this, "LOCATION_CHANNEL")
            .setContentTitle("位置更新中")
            .setContentText("正在获取实时位置")
            .setSmallIcon(R.drawable.ic_location)
            .build();

    startForeground(1, notification);
}

5. 其他排查点

  • 检查设备位置服务:确保设备已开启位置服务,并设置为高精度模式(GPS+网络)。
  • 修正LocationRequest语法错误:你的代码中setSmallestDisplacement(5 f)存在语法错误,应为setSmallestDisplacement(5f)。
  • 验证回调是否触发:查看Logcat中是否有Location Updated的日志,确认FusedLocationProvider是否返回位置数据。如果没有回调,检查权限是否正确授予、位置服务是否开启。

内容的提问来源于stack exchange,提问作者J-44 Shivam Sawale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:33:15