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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:20