现在的位置: 首页 > 综合 > 正文

GSPUtil

2013年10月07日 ⁄ 综合 ⁄ 共 5768字 ⁄ 字号 评论关闭
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);
		}
	}


}

抱歉!评论已关闭.