Android best way to get current location
本问题已经有最佳答案,请猛点这里访问。
在以下场景中获取android当前位置的最佳方法是什么,
如果GPS不可用,请从网络提供商处获取位置
如果GPS可用并且可以获得当前位置,请从GPS提供商处获取位置
如果GPS可用但无法获得当前位置(即连续搜索位置),请从网络提供商处获取位置。
现在如果gps不可用,我可以从网络获取位置,我们非常感谢满足上述情况的最佳答案。 提前致谢。
好吧,你可以使用Timer和TimerTask类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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; } } }; |
LocationListener的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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毫秒执行一次计时器任务的
倾听者
1 2 | public interface OnLocationReceivedListener { public void onLocationReceived(Location mLoc); //callback method which will be defined in your class. |
}
您的类应该实现上面定义的侦听器。在你的班上:
1 2 3 4 | @Override public void onLocationReceived(Location mLoc) { //Do your stuff } |
希望能帮助到你。如果有人有更好的方法,请告诉我。
班级成员
请求Gps位置更新并设置倒数计时器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 } }; |
1 | If GPS is available and can get current location, |
对于上述问题,您可以尝试这样做..
使用此功能,您可以获取当前位置的纬度和经度,然后传递该值以获取地图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | 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) { } } } |