如何获取安卓设备的GPS位置

9
我正在尝试创建一个持续的GPS监听器,每x分钟将其位置(经度和纬度坐标)发送到Web服务器。在点击按钮时,它还将其位置发送到Web服务器。我意识到要获取GPS信号,您需要键入多久才能找到一个位置,但是如何编写程序以获取GPS位置并在x分钟内发送其坐标(即使在后台运行时也是如此,而不是通过按钮按下)?

//在单击中

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, whatshouldIputhere?, 0, this);

并且。
public void onLocationChanged(Location location) {
    if (location != null) {
        double lat = location.getLatitude();
        double lng = location.getLongitude();
    }
}

您可能希望使用更高级的API,它具有更简单的界面并附带其他功能:https://github.com/delight-im/Android-SimpleLocation - caw
请查看以下链接:https://github.com/meetmehdi/GetAccurateLocation - Syed Raza Mehdi
5个回答

18

我已经把它搞定了:

private void _getLocation() {
    // Get the location manager
    LocationManager locationManager = (LocationManager) 
            getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(bestProvider);
    try {
        lat = location.getLatitude();
        lon = location.getLongitude();
    } catch (NullPointerException e) {
        lat = -1.0;
        lon = -1.0;
    }
}

很简单。它获取最佳提供商并获取其上次已知位置。
如果你只想用GPS,可以尝试这个

希望能有所帮助!

编辑:

试试这个:

private void _getLocation() {
    // Get the location manager
    LocationManager locationManager = (LocationManager) 
            getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(bestProvider);
    LocationListener loc_listener = new LocationListener() {

        public void onLocationChanged(Location l) {}

        public void onProviderEnabled(String p) {}

        public void onProviderDisabled(String p) {}

        public void onStatusChanged(String p, int status, Bundle extras) {}
    };
    locationManager
            .requestLocationUpdates(bestProvider, 0, 0, loc_listener);
    location = locationManager.getLastKnownLocation(bestProvider);
    try {
        lat = location.getLatitude();
        lon = location.getLongitude();
    } catch (NullPointerException e) {
        lat = -1.0;
        lon = -1.0;
    }
}

这段代码获取最后已知的位置,然后请求实际位置。


嗨,我目前正在使用此方法来更新按钮单击。你能告诉我为什么它给我的位置大约比我实际所在的位置要偏离2个街区吗?我已经尝试了5次,但我一直得到相同的位置。 - Sean
该方法返回最后已知的位置,如果您想在运行该方法时获取位置,则必须请求它。我编辑了我的答案,请检查一下。 - andoni90
我的代码在异步任务中运行,当我放入编辑后的代码时,我被迫在locationManager.requestLocationUpdates(bestProvider,0,0,loc_listener);上面放置looper.prepare()。这样做后,我的程序仍然发送相同(不正确)的GPS信号。 - Sean

3

一种方法是使用 TimerTimerTask

Timer timer = new Timer();
timer.scheduleAtFixedRate(new SendLocationTask(), 0, 60000);

class SendLocationTask extends TimerTask{
    public abstract void run(){
        // send position info here
    }
}

这个计时器类会在应用程序在后台运行并且其他人正在使用另一个应用程序时,以60000秒的间隔继续工作吗?例如:除非您关闭此应用程序的后台更新,否则将持续发布您的位置。 - Sean
这取决于您放置此代码片段的位置。如果将其放置在“Service”中,则应该可以在后台工作,直到显式调用“stopService()”。 - romy_ngo

2

您可以创建一个后台运行的线程,并每隔x分钟调用一个函数来获取实际位置(请注意,您需要创建一个获取x、y坐标的函数,因为您将在按钮单击时使用它)。对于您发布的代码:

locationManager.requestUpdates(provider, minTime, minDistance, intent);

这意味着你的应用程序将每隔x分钟向GPS模块发送请求,以获取whatshouldIputhere?

祝你好运, Arkde


2
有多种方法可供使用。您可以使用单独的线程等待 x 分钟,然后将最新已知位置发送到服务器。或者您可以使用一个服务来完成几乎相同的任务。第三种可能性是使用处理器

0

这段代码在我的设备上运行正常(API 17)

try {
    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
    {
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    lat = location.getLatitude();
        lon = location.getLongitude();


    }
}
catch (Exception e){
    e.printStackTrace();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接