最近公司項目要實現(xiàn)一個定時向后臺放送Gps數(shù)據(jù),也就是經(jīng)緯度,網(wǎng)上的Demo很多,基本都是沒有封裝過的永淌,用起來很不方便,于是我自己動手封裝了一個utilis工具昌跌,用起來很方便仰禀,直接調(diào)用,目前我只知道Android5.0以前的版本會出現(xiàn)異常蚕愤,其他版本都支持
public class LocationUtils {
private static final long REFRESH_TIME =5000L;
private static final float METER_POSITION =0.0f;
private static ILocationListenermLocationListener;
private static LocationListenerlistener =new MyLocationListener();
private static class MyLocationListenerimplements LocationListener {
@Override
? ? ? ? public void onLocationChanged(Location location) {//定位改變監(jiān)聽
? ? ? ? ? ? if (mLocationListener !=null) {
mLocationListener.onSuccessLocation(location);
}
}
@Override
? ? ? ? public void onStatusChanged(String provider,int status, Bundle extras) {//定位狀態(tài)監(jiān)聽
? ? ? ? }
@Override
? ? ? ? public void onProviderEnabled(String provider) {//定位狀態(tài)可用監(jiān)聽
? ? ? ? }
@Override
? ? ? ? public void onProviderDisabled(String provider) {//定位狀態(tài)不可用監(jiān)聽
? ? ? ? }
}
/**
* GPS獲取定位方式
*/
? ? public static Location getGPSLocation(@NonNull Context context) {
Location location =null;
LocationManager manager =getLocationManager(context);
//高版本的權(quán)限檢查
? ? ? ? if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return null;
}
if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否支持GPS定位
//獲取最后的GPS定位信息答恶,如果是第一次打開,一般會拿不到定位信息萍诱,一般可以請求監(jiān)聽悬嗓,在有效的時間范圍可以獲取定位信息
? ? ? ? ? ? location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
return location;
}
/**
* network獲取定位方式
*/
? ? public static Location getNetWorkLocation(Context context) {
Location location =null;
LocationManager manager =getLocationManager(context);
//高版本的權(quán)限檢查
? ? ? ? if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return null;
}
if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//是否支持Network定位
//獲取最后的network定位信息
? ? ? ? ? ? location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
return location;
}
/**
* 獲取最好的定位方式
*/
? ? public static Location getBestLocation(Context context, Criteria criteria) {
Location location;
LocationManager manager =getLocationManager(context);
if (criteria ==null) {
criteria =new Criteria();
}
String provider = manager.getBestProvider(criteria,true);
if (TextUtils.isEmpty(provider)) {
//如果找不到最適合的定位,使用network定位
? ? ? ? ? ? location =getNetWorkLocation(context);
}else {
//高版本的權(quán)限檢查
? ? ? ? ? ? if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
? ? ? ? ? ? ? ? ? ? && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return null;
}
//獲取最適合的定位方式的最后的定位權(quán)限
? ? ? ? ? ? location = manager.getLastKnownLocation(provider);
}
return location;
}
/**
* 定位監(jiān)聽
*/
? ? public static void addLocationListener(Context context, String provider, ILocationListener locationListener) {
addLocationListener(context, provider,REFRESH_TIME,METER_POSITION, locationListener);
}
/**
* 定位監(jiān)聽
*/
? ? public static void addLocationListener(Context context, String provider,long time,float meter, ILocationListener locationListener) {
if (locationListener !=null) {
mLocationListener = locationListener;
}
if (listener ==null) {
listener =new MyLocationListener();
}
LocationManager manager =getLocationManager(context);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
? ? ? ? ? ? ? ? && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
manager.requestLocationUpdates(provider, time, meter,listener);
}
/**
* 取消定位監(jiān)聽
*/
? ? public static void unRegisterListener(Context context) {
if (listener !=null) {
LocationManager manager =getLocationManager(context);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
? ? ? ? ? ? ? ? ? ? && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//移除定位監(jiān)聽
? ? ? ? ? ? manager.removeUpdates(listener);
}
}
private static LocationManager getLocationManager(@NonNull Context context) {
return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
/**
* 自定義接口
*/
? ? public interface ILocationListener {
void onSuccessLocation(Location location);
}
/**
* 采用最好的方式獲取定位信息
* 獲取經(jīng)度
*/
? ? public static double getBestLocationLatitude() {
Criteria c =new Criteria();//Criteria類是設(shè)置定位的標(biāo)準(zhǔn)信息(系統(tǒng)會根據(jù)你的要求裕坊,匹配最適合你的定位供應(yīng)商)包竹,一個定位的輔助信息的類
? ? ? ? c.setPowerRequirement(Criteria.POWER_LOW);//設(shè)置低耗電
? ? ? ? c.setAltitudeRequired(true);//設(shè)置需要海拔
? ? ? ? c.setBearingAccuracy(Criteria.ACCURACY_COARSE);//設(shè)置COARSE精度標(biāo)準(zhǔn)
? ? ? ? c.setAccuracy(Criteria.ACCURACY_LOW);//設(shè)置低精度
//... Criteria 還有其他屬性,就不一一介紹了
? ? ? ? Location best = LocationUtils.getBestLocation(MyApplication.getInstance(), c);
return best.getLatitude();
}
/**
* 采用最好的方式獲取定位信息
* 獲取緯度
*/
? ? public static double getBestLocationLongtitude() {
Criteria c =new Criteria();//Criteria類是設(shè)置定位的標(biāo)準(zhǔn)信息(系統(tǒng)會根據(jù)你的要求,匹配最適合你的定位供應(yīng)商)周瞎,一個定位的輔助信息的類
? ? ? ? c.setPowerRequirement(Criteria.POWER_LOW);//設(shè)置低耗電
? ? ? ? c.setAltitudeRequired(true);//設(shè)置需要海拔
? ? ? ? c.setBearingAccuracy(Criteria.ACCURACY_COARSE);//設(shè)置COARSE精度標(biāo)準(zhǔn)
? ? ? ? c.setAccuracy(Criteria.ACCURACY_LOW);//設(shè)置低精度
//... Criteria 還有其他屬性苗缩,就不一一介紹了
? ? ? ? Location best = LocationUtils.getBestLocation(MyApplication.getInstance(), c);
return best.getLongitude();
}
}