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

使用FusedLocationProviderClient无法获取经纬度问题求助

无法通过FusedLocationProviderClient获取经纬度并显示的问题修复

核心问题分析

  1. 权限请求无回调处理:调用requestPermissions后,用户完成授权操作后没有触发重新获取位置的逻辑,导致授权成功后getlastLocation()未被再次调用。
  2. getLastLocation可能返回null:如果设备没有缓存的位置数据,该方法会返回null,此时需要主动请求实时位置更新才能获取有效数据。
  3. 缺少权限拒绝后的反馈逻辑:用户拒绝权限时没有给出明确提示,也未处理后续流程。

修复步骤与完整代码

1. 重写权限回调方法,处理授权结果

当用户授予权限后立即触发位置获取;拒绝时给出提示。

2. 处理缓存位置为空的情况

通过LocationRequest和LocationCallback主动请求实时位置更新,确保能获取到有效位置数据。

3. 完善生命周期管理

在Activity销毁时移除位置更新回调,避免内存泄漏。

修改后的完整代码:

package com.example.morror;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnSuccessListener;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class SplashActivity extends AppCompatActivity {
    private final static int REQUEST_CODE = 100;
    private TextView introTextView;
    private FusedLocationProviderClient fusedLocationClient;
    private LocationCallback locationCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        introTextView = findViewById(R.id.intro);

        checkLocationPermission();
        letsgo();
    }

    private void checkLocationPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
        } else {
            getLocation();
        }
    }

    private void getLocation() {
        // 优先获取缓存位置
        fusedLocationClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    updateLocationUI(location);
                } else {
                    // 缓存为空,请求实时位置更新
                    requestLocationUpdates();
                }
            }
        });
    }

    private void requestLocationUpdates() {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(5000);

        locationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if (locationResult == null) return;
                for (Location location : locationResult.getLocations()) {
                    updateLocationUI(location);
                    // 获取到位置后停止更新
                    fusedLocationClient.removeLocationUpdates(locationCallback);
                }
            }
        };

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
        }
    }

    private void updateLocationUI(Location location) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        introTextView.setText("Latitude: " + latitude + "\nLongitude: " + longitude);
    }

    private void letsgo() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent home = new Intent(SplashActivity.this, MainActivity.class);
                startActivity(home);
                finish();
            }
        }, 4000);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getLocation();
            } else {
                introTextView.setText("位置权限被拒绝,无法获取经纬度");
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 清理位置更新回调
        if (locationCallback != null) {
            fusedLocationClient.removeLocationUpdates(locationCallback);
        }
    }
}

额外配置要求

  1. 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" />
  1. build.gradle添加依赖:
dependencies {
    implementation 'com.google.android.gms:play-services-location:21.0.1'
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:42:53