本问题已经有最佳答案,请猛点这里访问。

在以下场景中获取android当前位置的最佳方法是什么,

如果GPS不可用,请从网络提供商处获取位置

如果GPS可用并且可以获得当前位置,请从GPS提供商处获取位置

如果GPS可用但无法获得当前位置(即连续搜索位置),请从网络提供商处获取位置。

现在如果gps不可用,我可以从网络获取位置,我们非常感谢满足上述情况的最佳答案。 提前致谢。

查看此库:code.google.com/p/little-fluffy-location-library

你有没有看看旧帖子1. stackoverflow.com/questions/1513485/… 2. stackoverflow.com/questions/3145089/…

最简单的方法是使用这样的高级库:github.com/delight-im/Android-SimpleLocation

好吧,你可以使用Timer和TimerTask类。

LocationManager manager;

TimerTask mTimertask;

GPSLocationListener mGPSLocationListener;

int i = 0; //Here i works as counter;

private static final int MAX_ATTEMPTS = 250;

public void getCurrentLocation() {

manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

mGPSLocationListener = new GPSLocationListener();

manager.addGpsStatusListener(mGPSStatusListener);

mTimerTask = new LocTimerTask(LocationManager.GPS_PROVIDER);

if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

Log.v(TAG,"GPS ENABLED");

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L,

50.0f, mGPSLocationListener);

} else {

turnGPSOn();

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L,

50.0f, mGPSLocationListener);

}

if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {

manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L,

50.0f, mNetworkLocationListener);

}

if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {

Log.v(TAG,"GPS ENABLED");

manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,

1000L, 50.0f, mGPSLocationListener);

}

myLocTimer = new Timer("LocationRunner", true);

myLocTimer.schedule(mTimerTask, 0, 500);

}

GPSStatusListener

private GpsStatus.Listener mGPSStatusListener = new GpsStatus.Listener() {

@Override

public synchronized void onGpsStatusChanged(int event) {

switch (event) {

case GpsStatus.GPS_EVENT_SATELLITE_STATUS:

Log.v(TAG,"GPS SAtellitestatus");

GpsStatus status = manager.getGpsStatus(null);

mSattelites = 0;

Iterable list = status.getSatellites();

for (GpsSatellite satellite : list) {

if (satellite.usedInFix()) {

mSattelites++;

}

}

break;

case GpsStatus.GPS_EVENT_FIRST_FIX:

/*

* Toast.makeText(getApplicationContext(),"Got First Fix",

* Toast.LENGTH_LONG).show();

*/

break;

case GpsStatus.GPS_EVENT_STARTED:

/*

* Toast.makeText(getApplicationContext(),"GPS Event Started",

* Toast.LENGTH_LONG).show();

*/

break;

case GpsStatus.GPS_EVENT_STOPPED:

/*

* Toast.makeText(getApplicationContext(),"GPS Event Stopped",

* Toast.LENGTH_LONG).show();

*/

break;

default:

break;

}

}

};

LocationListener的

public class GPSLocationListener implements LocationListener {

@Override

public void onLocationChanged(Location argLocation) {

location = argLocation;

}

public void onProviderDisabled(String provider) {

}

public void onProviderEnabled(String provider) {

}

public void onStatusChanged(String provider, int status, Bundle extras) {

}

}

TimerTask类

class LocTimerTask extends TimerTask {

String provider;

public LocTimerTask(String provider) {

this.provider = provider;

}

final Handler mHandler = new Handler(Looper.getMainLooper());

Runnable r = new Runnable() {

@Override

public void run() {

i++;

Log.v(TAG,"Timer Task run" + i);

location = manager.getLastKnownLocation(provider);

if (location != null) {

Log.v(TAG,"in timer task run in if location not null");

isGPS = true;

onLocationReceived(location);

myLocTimer.cancel();

myLocTimer.purge();

mTimerTask.cancel();

return;

} else {

Log.v(TAG,"in timer task run in else location null");

isGPS = false;

if (location == null && i == MAX_ATTEMPTS) {

Log.v(TAG,"if 1 max attempts done");

turnGPSOff();

location = manager

.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (location != null) {

Log.v(TAG,

"if 1 max attempts done Location from network not null");

Log.v(TAG,

"if 1 max attempts done Location from network not null coordinates not null");

onLocationReceived(location);

myLocTimer.cancel();

myLocTimer.purge();

mTimerTask.cancel();

return;

}

} else {

return;

}

}

i = 0;

}

};

public void run() {

mHandler.post(r);

}

}

这里计时器已经安排在每500毫秒运行一次。意味着,每500毫秒执行一次计时器任务的run method。在运行方法尝试获取GPS提供商的位置特定号码。尝试(此处为MAX_ATTEMPTS)表示5或10.如果它在指定的no内获得位置。然后,如果counter(Here i)值超过MAX_ATTEMPTS,则尝试使用该位置,然后从Network Provider获取位置。在获取位置时,我已将该位置传递给回调方法onLocationReceived(Location mLoc),您可以在其中进一步处理位置数据。以下是使用回调方法的方法:

倾听者

public interface OnLocationReceivedListener {

public void onLocationReceived(Location mLoc); //callback method which will be defined in your class.

}

您的类应该实现上面定义的侦听器。在你的班上:

@Override

public void onLocationReceived(Location mLoc) {

//Do your stuff

}

希望能帮助到你。如果有人有更好的方法,请告诉我。

班级成员boolean mIsGpsFix;

请求Gps位置更新并设置倒数计时器

mCountDown.start();

private CountDownTimer mCountDown = new CountDownTimer(time to wait for Gps fix, same as right)

{

@Override

public void onTick(long millisUntilFinished)

{

}

@Override

public void onFinish()

{

// No fix after the desire amount of time collapse

if (!mIsGpsFix)

// Register for Network

}

};

If GPS is available and can get current location,

对于上述问题,您可以尝试这样做..

使用此功能,您可以获取当前位置的纬度和经度,然后传递该值以获取地图。

public class MyLocationListener implements LocationListener

{

@Override

public void onLocationChanged(Location loc)

{

loc.getLatitude();

loc.getLongitude();

String Text ="My current location is:" +

"Latitud =" + loc.getLatitude() +

"Longitud =" + loc.getLongitude();

Toast.makeText( getApplicationContext(),

Text,

Toast.LENGTH_SHORT).show();

}

@Override

public void onProviderDisabled(String provider)

{

Toast.makeText( getApplicationContext(),

"Gps Disabled",

Toast.LENGTH_SHORT ).show();

}

@Override

public void onProviderEnabled(String provider)

{

Toast.makeText( getApplicationContext(),

"Gps Enabled",

Toast.LENGTH_SHORT).show();

}

@Override

public void onStatusChanged(String provider, int status, Bundle extras)

{

}

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐