使用FusedLocationProviderClient无法获取经纬度问题求助
无法通过FusedLocationProviderClient获取经纬度并显示的问题修复
核心问题分析
- 权限请求无回调处理:调用
requestPermissions后,用户完成授权操作后没有触发重新获取位置的逻辑,导致授权成功后getlastLocation()未被再次调用。 - getLastLocation可能返回null:如果设备没有缓存的位置数据,该方法会返回null,此时需要主动请求实时位置更新才能获取有效数据。
- 缺少权限拒绝后的反馈逻辑:用户拒绝权限时没有给出明确提示,也未处理后续流程。
修复步骤与完整代码
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); } } }
额外配置要求
- 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" />
- build.gradle添加依赖:
dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' }
内容的提问来源于stack exchange,提问作者k1rit0
相关产品推荐
相关产品推荐

