Android获取当前位置的最佳方式[重复]
Posted
技术标签:
【中文标题】Android获取当前位置的最佳方式[重复]【英文标题】:Android best way to get current location [duplicate] 【发布时间】:2013-03-17 04:34:11 【问题描述】:对于以下场景,在 android 中获取当前位置的最佳方法是什么,
如果 GPS 不可用,请从网络提供商处获取位置
如果 GPS 可用并且可以获取当前位置,请从 GPS 提供商获取位置
如果 GPS 可用但无法获取当前位置(即不断搜索位置),请从网络提供商处获取位置。
现在,如果 gps 不可用,我可以从网络获取位置,非常感谢满足上述情况的最佳答案。提前致谢。
【问题讨论】:
查看这个库:code.google.com/p/little-fluffy-location-library 您查看过旧帖子 1.***.com/questions/1513485/… 2.***.com/questions/3145089/… 最简单的方法是使用这样的高级库:github.com/delight-im/Android-SimpleLocation 【参考方案1】:嗯,你可以使用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<GpsSatellite> 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;
;
位置监听器
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。如果它在指定数量内获得位置。如果计数器(Here i)值已超过 MAX_ATTEMPTS,则尝试使用该位置,然后从网络提供商处获取位置。在获取位置时,我已将该位置传递给回调方法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
希望对您有所帮助。如果有人有更好的方法,请告诉我。
【讨论】:
【参考方案2】: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)
【讨论】:
【参考方案3】:班级成员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
;
【讨论】:
以上是关于Android获取当前位置的最佳方式[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用onRequestPermissionsResult以编程方式获取设备IMEI号码android java的最佳方法[重复]