Android无法获取当前经纬度问题求助
无法获取设备经纬度,显示"Unable to find correct location"
我尝试在Android应用的文本框中显示当前位置的经度和纬度,但运行代码后始终提示"Unable to find correct location"。我已经在AndroidManifest.xml中添加了必要权限,相关代码如下:
MainActivity代码
package com.example.laptop.findlonglat; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; public class MainActivity extends AppCompatActivity { static final int REQUEST_LOCATION = 1; LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); getLocation(); } void getLocation() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); } else { Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { double latti = location.getLatitude(); double longi = location.getLongitude(); ((EditText) findViewById(R.id.etLocationLat)).setText("Latitude: " + latti); ((EditText) findViewById(R.id.etLocationLong)).setText("Longitude: " + longi); } else { ((EditText) findViewById(R.id.etLocationLat)).setText("Unable to find correct location."); ((EditText) findViewById(R.id.etLocationLong)).setText("Unable to find correct location. "); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_LOCATION: getLocation(); break; } } }
AndroidManifest.xml权限配置
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/>
请问有什么解决该问题的方案?
解决方案
1. 先检查定位服务是否开启
getLastKnownLocation只能获取系统缓存的历史位置,如果设备的网络定位或GPS服务没开启,系统根本没有缓存的位置数据,自然返回null。你可以在getLocation方法开头先做个检查:
// 检查网络定位和GPS是否开启 boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (!isNetworkEnabled && !isGpsEnabled) { ((EditText) findViewById(R.id.etLocationLat)).setText("请先开启设备的定位服务"); ((EditText) findViewById(R.id.etLocationLong)).setText("请先开启设备的定位服务"); return; }
2. 不要只依赖getLastKnownLocation
这个方法的局限性很大——如果是应用第一次启动、设备刚重启,或者很久没获取过位置,缓存就会是空的。更可靠的方式是注册位置监听器,主动获取实时位置更新:
// 在权限通过后替换原来的getLastKnownLocation逻辑 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // 注册监听器,每隔1秒、位置变化超过1米时更新 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, new android.location.LocationListener() { @Override public void onLocationChanged(Location location) { // 获取到位置后更新UI double latti = location.getLatitude(); double longi = location.getLongitude(); ((EditText) findViewById(R.id.etLocationLat)).setText("Latitude: " + latti); ((EditText) findViewById(R.id.etLocationLong)).setText("Longitude: " + longi); // 拿到位置后可以移除监听器,避免持续消耗资源 locationManager.removeUpdates(this); } @Override public void onStatusChanged(String provider, int status, Bundle extras) {} @Override public void onProviderEnabled(String provider) {} @Override public void onProviderDisabled(String provider) {} }); }
3. 适配Android 10+的后台定位权限
如果你的应用目标SDK版本是29(Android 10)及以上,想要在后台也能获取位置,还需要添加ACCESS_BACKGROUND_LOCATION权限,并动态请求:
- 在
AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
- 修改权限请求代码,把这个权限也加入请求数组:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION}, REQUEST_LOCATION);
4. 测试环境的注意事项
- 模拟器测试:需要手动设置模拟位置——打开模拟器的扩展面板(三个点的按钮),找到「Location」选项,输入经纬度后点击「Set」,再运行应用。
- 真机测试:确保设备有良好的网络(移动数据或WiFi)或GPS信号,首次获取位置可能需要3-5秒的时间,不要立刻判定为失败。
5. 完善权限请求逻辑
你当前的权限请求只申请了ACCESS_FINE_LOCATION,但代码里同时检查了ACCESS_COARSE_LOCATION,建议把两个权限都加入请求,避免权限不匹配的问题:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION);
内容的提问来源于stack exchange,提问作者user2347478
相关产品推荐
相关产品推荐

