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);
}
}
}
GSPUtil
最新推荐文章于 2020-12-01 10:59:13 发布