GSPUtil

来源:互联网 发布:灰色模型软件 编辑:程序博客网 时间:2024/05/29 03:16
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() {@Overridepublic 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);}}@Overridepublic void onProviderDisabled(String provider) {// Provider被disable时触发此函数,比如GPS被关闭Log.v("onProviderDisabled", "=onProviderDisabled");}@Overridepublic void onProviderEnabled(String provider) {// Provider被enable时触发此函数,比如GPS被打开Log.v("onProviderEnabled", "=onProviderEnabled");}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {// Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数Log.v("onStatusChanged", "=onStatusChanged");}};// 超时注销服务private Handler myHandler = new Handler() {@Overridepublic 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();}@Overridepublic 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恢复活动时,响应位置更新@Overridepublic void onResume() {if (null != provider) {locationManager.requestLocationUpdates(provider, minTime,minDistance, mLocationListener);}}// 在Activity暂停活动时,取消位置更新@Overridepublic void onPause() {if (null != locationManager) {locationManager.removeUpdates(mLocationListener);}}}


原创粉丝点击