网上摘的,可以用,这里仅作记录。
1.工具类代码如下:
/**
* 通过GPS或网络获取地理位置
*/
public class LocationUtils {
private FragmentActivity mFragmentActivity;
private Handler mHandler;
private LocationManager mLocationManager;
public static final int UPDATE_ADDRESS = 1;
public static final int UPDATE_LATLNG = 2;
private static final int TEN_SECONDS = 10000;
private static final int TEN_METERS = 10;
private static final int TWO_MINUTES = 1000 * 60 * 2;
private static LocationUtils mLocationUtils;
public static LocationUtils getInstance(FragmentActivity fragmentActivity, Handler handler) {
return mLocationUtils == null ? new LocationUtils(fragmentActivity, handler) : mLocationUtils;
}
private LocationUtils(FragmentActivity fragmentActivity, Handler handler) {
this.mHandler = handler;
this.mFragmentActivity = fragmentActivity;
mLocationManager = (LocationManager) mFragmentActivity.getSystemService(Context.LOCATION_SERVICE);
}
private LocationUtils() {
}
// Method to launch Settings
private void enableLocationSettings() {
Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mFragmentActivity.startActivity(settingsIntent);
}
// Stop receiving location updates whenever the Activity becomes invisible.
public void stop() {
mLocationManager.removeUpdates(listener);
}
public void setup() {
Location networkLocation = null;
mLocationManager.removeUpdates(listener);
networkLocation = requestUpdatesFromProvider(LocationManager.NETWORK_PROVIDER, R.string.common_not_open_google_location_service);
if (networkLocation != null) {
updateUILocation(networkLocation);
}
}
private Location requestUpdatesFromProvider(final String provider, final int errorResId) {
Location location = null;
if (mLocationManager.isProviderEnabled(provider)) {
mLocationManager.requestLocationUpdates(provider, TEN_SECONDS, TEN_METERS, listener);
location = mLocationManager.getLastKnownLocation(provider);
} else {
new EnableGpsDialogFragment().show(mFragmentActivity.getSupportFragmentManager(), mFragmentActivity.getResources().getString(errorResId));
}
return location;
}
private void doReverseGeocoding(Location location) {
(new ReverseGeocodingTask(mFragmentActivity)).execute(new Location[] { location });
}
private void updateUILocation(Location location) {
Message.obtain(mHandler, UPDATE_LATLNG, location).sendToTarget();
doReverseGeocoding(location);
}
private final LocationListener listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateUILocation(location);
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
protected Location getBetterLocation(Location newLocation, Location currentBestLocation) {
if (currentBestLocation == null) {
return newLocation;
}
long timeDelta = newLocation.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
boolean isNewer = timeDelta > 0;
if (isSignificantlyNewer) {
return newLocation;
} else if (isSignificantlyOlder) {
return currentBestLocation;
}
int accuracyDelta = (int) (newLocation.getAccuracy() - currentBestLocation.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
boolean isFromSameProvider = isSameProvider(newLocation.getProvider(), currentBestLocation.getProvider());
if (isMoreAccurate) {
return newLocation;
} else if (isNewer && !isLessAccurate) {
return newLocation;
} else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
return newLocation;
}
return currentBestLocation;
}
/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
if (provider1 == null) {
return provider2 == null;
}
return provider1.equals(provider2);
}
private class ReverseGeocodingTask extends AsyncTask<Location, Void, Void> {
Context mContext;
public ReverseGeocodingTask(Context context) {
super();
mContext = context;
}
@Override
protected Void doInBackground(Location... params) {
Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
Location loc = params[0];
List<Address> addresses = null;
try {
addresses = geocoder.getFromLocation(loc.getLatitude(), loc.getLongitude(), 1);
} catch (IOException e) {
e.printStackTrace();
Message.obtain(mHandler, UPDATE_ADDRESS, e.toString()).sendToTarget();
}
if (addresses != null && addresses.size() > 0) {
Address address = addresses.get(0);
Message.obtain(mHandler, UPDATE_ADDRESS, address).sendToTarget();
}
return null;
}
}
/**
* Dialog to prompt users to enable GPS on the device.
*/
private class EnableGpsDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity()).setTitle(R.string.common_error).setMessage(R.string.common_not_open_google_location_service)
.setPositiveButton(R.string.common_open_google_location_service, new DialogInterface.OnClickListener() {// Enable
// GPS
@Override
public void onClick(DialogInterface dialog, int which) {
enableLocationSettings();
}
}).create();
}
}
}
2.使用实例:
LocationUtils instance = LocationUtils.getInstance(activity, handler);
instance.setup();
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LocationUtils.UPDATE_ADDRESS:
if (msg.obj instanceof Address) {
Address address = (Address) msg.obj;
double longitude = address.getLongitude();
double latitude = address.getLatitude();
}
instance.stop();
break;
case LocationUtils.UPDATE_LATLNG:
instance.stop();
break;
}
}
};