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

求助:Google Play Services for Location未运行,FusedLocationProviderClient无法获取位置

解决Android 4.4上FusedLocationProviderClient无法触发位置服务的问题

问题原因

Android 4.4 系统中,FusedLocationProviderClient 依赖 Google Play Services 提供的位置服务,但它不会主动唤醒 GPS 硬件。而类似“Gps Test”的应用直接通过 LocationManager 调用 GPS_PROVIDER,会直接触发 GPS 硬件启动,状态栏因此出现搜索图标,同时激活位置服务,你的应用就能复用这个状态获取位置。

解决方案

通过结合 LocationManager 触发 GPS 硬件启动,再使用 FusedLocationProviderClient 获取位置,具体步骤如下:

1. 声明权限

在 AndroidManifest.xml 中添加位置权限:

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

2. 用LocationManager触发GPS启动

注册临时 GPS 监听器,触发硬件唤醒,拿到一次位置后立即注销,避免耗电:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

// 临时GPS监听器,仅用于触发硬件启动
LocationListener tempGpsListener = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        // 拿到位置后注销监听器
        locationManager.removeUpdates(this);
        // 启动FusedLocationProviderClient获取位置
        startFusedLocationUpdates();
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
    @Override
    public void onProviderEnabled(String provider) {}
    @Override
    public void onProviderDisabled(String provider) {}
};

// 检查GPS是否开启
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    // 请求单次GPS更新,触发硬件启动
    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, tempGpsListener, Looper.getMainLooper());
} else {
    // 引导用户打开GPS
    Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(gpsIntent);
}

3. 配置FusedLocationProviderClient获取位置

设置高优先级的位置请求,确保能获取精准位置:

private void startFusedLocationUpdates() {
    FusedLocationProviderClient fusedClient = LocationServices.getFusedLocationProviderClient(this);

    LocationRequest locationRequest = LocationRequest.create();
    // 设置高优先级,强制使用GPS
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(10000); // 常规更新间隔10秒
    locationRequest.setFastestInterval(5000); // 最快更新间隔5秒

    // 检查权限(Android 4.4无需运行时权限,但兼容高版本)
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        fusedClient.requestLocationUpdates(locationRequest, new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if (locationResult != null && locationResult.getLastLocation() != null) {
                    Location currentLocation = locationResult.getLastLocation();
                    // 处理获取到的位置信息
                }
            }
        }, Looper.getMainLooper());
    }
}

Android 11测试注意事项

  • 需主动申请运行时权限:除了 ACCESS_FINE_LOCATION,如果需要后台获取位置,还需申请 ACCESS_BACKGROUND_LOCATION。
  • 位置请求配置需符合Android 11的隐私规范,避免被系统限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:35:34