Get location on click of a button with default provider
本问题已经有最佳答案,请猛点这里访问。
我需要在点击按钮时使用NETWORK_PROVIDER获取当前位置。 如果网络不可用,我想使用GPS_PROVIDER获取位置。 我怎样才能做到这一点?
这是我在我的情况下做的事情:
MyLocation类:
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | import android.app.ProgressDialog; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Looper; public class MyLocation { // Timer timer1; LocationManager lm; LocationResult locationResult; boolean gps_enabled=false; boolean network_enabled=false; AsyncTask<Context, Void, Void> mtask; public boolean getLocation(Context context, LocationResult result) { //I use LocationResult callback class to pass location value from MyLocation to user code. locationResult=result; if(lm==null) lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); //exceptions will be thrown if provider is not permitted. try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){} //don't start listeners if no provider is enabled if(!gps_enabled && !network_enabled) return false; if(gps_enabled) lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); if(network_enabled) lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); // timer1=new Timer(); // timer1.schedule(new GetLastLocation(), 20000); mtask= new GetLastLocation().execute(); return true; } LocationListener locationListenerGps = new LocationListener() { public void onLocationChanged(Location location) { // timer1.cancel(); mtask.cancel(true); locationResult.gotLocation(location); lm.removeUpdates(this); lm.removeUpdates(locationListenerNetwork); } public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }; LocationListener locationListenerNetwork = new LocationListener() { public void onLocationChanged(Location location) { mtask.cancel(true); locationResult.gotLocation(location); lm.removeUpdates(this); lm.removeUpdates(locationListenerGps); } public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }; private Context mContext; public MyLocation(Context c) { this.mContext = c; } class GetLastLocation extends AsyncTask<Context, Void, Void> { ProgressDialog dialog = new ProgressDialog(mContext); protected void onPreExecute() { dialog.setMessage("Searching...."); dialog.show(); } protected Void doInBackground(Context... params) { Handler mHandler = new Handler(Looper.getMainLooper()); // ... mHandler.post(new Runnable() { public void run() { lm.removeUpdates(locationListenerGps); lm.removeUpdates(locationListenerNetwork); Location net_loc=null, gps_loc=null; if(gps_enabled) gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); if(network_enabled) net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); //if there are both values use the latest one if(gps_loc!=null && net_loc!=null){ if(gps_loc.getTime()>net_loc.getTime()) locationResult.gotLocation(gps_loc); else locationResult.gotLocation(net_loc); return; } if(gps_loc!=null){ locationResult.gotLocation(gps_loc); return; } if(net_loc!=null){ locationResult.gotLocation(net_loc); return; } locationResult.gotLocation(null); } }); // ... return null; } protected void onPostExecute(final Void unused) { dialog.dismiss(); } } public static abstract class LocationResult{ public abstract void gotLocation(Location location); } } |
按钮点击的方法:
1 2 3 4 5 6 7 8 9 10 11 12 | MyLocation myLocation = new MyLocation(); private void locationClick() { myLocation.getLocation(this, locationResult)); } public LocationResult locationResult = new LocationResult(){ @Override public void gotLocation(final Location location){ //Got the location! }); } }; |
我在stackoverflow中发现了这个问题,当时我正在寻找类似问题的解决方案......
您已使用此方法检查所有启用提供程序
1 2 3 4 5 6 7 8 9 | void requestLocationUpdates() { locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); List<String> enabledProviders = this.locationManager.getProviders(true); for (String provider:enabledProviders){ Log.i(">>>>>>>","Requesting location updates from provider" + provider); this.locationManager.requestLocationUpdates(provider, 10000l, 10, this); } } |
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 | LocationManager locMgr = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); LocationListener locListner = new LocationListener() { public void onProviderEnabled(String provider) { } public void onProviderDisabled(String provider) { } public void onLocationChanged(Location location) { // CODE TO READ LOCATION } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }; // ON Click of button do this request. locMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListner); |
您还需要在清单文件中添加权限
1 | <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> |
有关详细信息,请参阅开发者指