package org.join.weather.util; import java.util.List; import org.join.weather.WeatherActivity; import org.join.weather.WeatherActivity.OnActivityResumeAndPauseListener; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager.OnActivityResultListener; import android.provider.Settings; import android.util.Log; import android.widget.Toast; public class GPSUtil implements OnActivityResultListener, OnActivityResumeAndPauseListener { // WeatherActivity对象 private WeatherActivity weatherActivity; // LocationManager对象 private LocationManager locationManager; // Location对象 private Location location; // 当前位置提供者 private String provider; // 时间(秒) private long minTime = 60 * 1000; // 距离(米) private float minDistance = 500; // 定位方式 private int mode = 1; // 位置监听接口 private LocationListener mLocationListener = new LocationListener() { @Override public void onLocationChanged(final Location loc) { // 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 Log.v("onLocationChanged", "=onLocationChanged"); if (loc != null) { location = loc; showLocationInfo(loc); } else { Toast.makeText(weatherActivity, "当前位置不可定位!", Toast.LENGTH_SHORT) .show(); // 注销监听事件 // locationManager.removeUpdates(mLocationListener); } } @Override public void onProviderDisabled(String provider) { // Provider被disable时触发此函数,比如GPS被关闭 Log.v("onProviderDisabled", "=onProviderDisabled"); } @Override public void onProviderEnabled(String provider) { // Provider被enable时触发此函数,比如GPS被打开 Log.v("onProviderEnabled", "=onProviderEnabled"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 Log.v("onStatusChanged", "=onStatusChanged"); } }; // 超时注销服务 private Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { if (null == location) { // 提示信息 Toast.makeText(weatherActivity, "当前位置不可定位!", Toast.LENGTH_SHORT) .show(); } // 注销监听事件 locationManager.removeUpdates(mLocationListener); } }; public GPSUtil(WeatherActivity weatherActivity, int mode) { this.weatherActivity = weatherActivity; weatherActivity.setOnActivityResultListener(this); weatherActivity.setOnResumeAndPauseListener(this); this.mode = mode; // 获得LocationManager服务 locationManager = (LocationManager) weatherActivity .getSystemService(Context.LOCATION_SERVICE); if (openGPSSettings()) { setLocationServer(mode); } else { Toast.makeText(weatherActivity, "请开启GPS!", Toast.LENGTH_SHORT) .show(); Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); // 此为设置完成后返回到获取界面 weatherActivity.startActivityForResult(intent, 0); } } public GPSUtil(WeatherActivity weatherActivity, int mode, long minTime, float minDistance) { this(weatherActivity, mode); this.minTime = minTime; this.minDistance = minDistance; } // 判断GPS模块是否存在或者是开启 private boolean openGPSSettings() { if (locationManager .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { return true; } return false; } // 更新当前位置信息(如果使用GPS,需要保证在室外,并且没有大建筑物遮挡,如果使用网络定位,要保证网络通畅) public void setLocationServer(int mode) { Toast.makeText(weatherActivity, "正在定位!", Toast.LENGTH_SHORT).show(); switch (mode) { case 1: { // GPS定位 if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { provider = LocationManager.GPS_PROVIDER; location = locationManager.getLastKnownLocation(provider); // 设置监听器,自动更新的最小时间为间隔N秒或最小位移变化超过N米 locationManager.requestLocationUpdates(provider, minTime, minDistance, mLocationListener); Log.v("GPS定位", "GPS定位!"); } else { Log.v("GPS定位", "未提供GPS定位功能!"); } break; } case 2: { // NETWORK定位 provider = LocationManager.NETWORK_PROVIDER; location = locationManager.getLastKnownLocation(provider); // 设置监听器,自动更新的最小时间为间隔N秒或最小位移变化超过N米 locationManager.requestLocationUpdates(provider, minTime, minDistance, mLocationListener); Log.v("NETWORK定位", "NETWORK定位!"); break; } case 3: { // 查询符合条件的Location Provider来定位 // 获得Criteria对象(指定条件参数) Criteria criteria = new Criteria(); // 获得最好的单位效果 criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(false); // 使用省电模式 criteria.setPowerRequirement(Criteria.POWER_LOW); // 获得当前位置的提供者 provider = locationManager.getBestProvider(criteria, true); // 获得当前位置 location = locationManager.getLastKnownLocation(provider); if (null != provider) { // 设置监听器,自动更新的最小时间为间隔N秒或最小位移变化超过N米 locationManager.requestLocationUpdates(provider, minTime, minDistance, mLocationListener); } else { Log.v("provider", "null == provider"); } Log.v("最优定位", provider); break; } } if (null != location) { showLocationInfo(location); } // 延迟10秒 myHandler.sendEmptyMessageDelayed(0, 10 * 1000); } // 显示定位信息 private void showLocationInfo(Location loc) { String msg = ""; try { msg = "经度:" + location.getLongitude() + "\n"; msg += "纬度:" + location.getLatitude() + "\n"; Geocoder gc = new Geocoder(weatherActivity); List<Address> addresses = gc.getFromLocation( location.getLatitude(), location.getLongitude(), 1); // 相关信息 if (addresses.size() > 0) { msg += "AddressLine:" + addresses.get(0).getAddressLine(0) + "\n"; msg += "CountryName:" + addresses.get(0).getCountryName() + "\n"; msg += "Locality:" + addresses.get(0).getLocality() + "\n"; msg += "FeatureName:" + addresses.get(0).getFeatureName(); } } catch (Exception e) { msg = e.getMessage(); } new AlertDialog.Builder(weatherActivity).setMessage(msg) .setPositiveButton("确定", null).show(); } @Override public boolean onActivityResult(int requestCode, int resultCode, Intent data) { // 从设置GPS的Activity返回时 if (0 == requestCode) { if (openGPSSettings()) { setLocationServer(mode); } else { Toast.makeText(weatherActivity, "GPS仍未开启!", Toast.LENGTH_SHORT) .show(); } } return false; } // 在Activity恢复活动时,响应位置更新 @Override public void onResume() { if (null != provider) { locationManager.requestLocationUpdates(provider, minTime, minDistance, mLocationListener); } } // 在Activity暂停活动时,取消位置更新 @Override public void onPause() { if (null != locationManager) { locationManager.removeUpdates(mLocationListener); } } }