android gps定位工具类,工具类之LocationUtils(定位工具类)
無須引入第三方定位,單純依賴v4包,如果只是需要簡單的定位,那么這份工具類可以很好地幫助到你,老司機不多說,辛酸的話語都留在了代碼里了,上效果演示
LocationDemo
Demo牛逼地顯示是當時查內存泄漏查吐血的功勞,具體坑可以查看相關Demo代碼,下面開始開車,嘟嘟嘟嘟~
站點
isGpsEnabled : 判斷Gps是否可用
isLocationEnabled : 判斷定位是否可用
openGpsSettings : 打開Gps設置界面
register : 注冊
unregister : 注銷
getAddress : 根據經緯度獲取地理位置
getCountryName : 根據經緯度獲取所在國家
getLocality : 根據經緯度獲取所在地
getStreet : 根據經緯度獲取所在街道
具體路線
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.location.LocationProvider;
import android.os.Bundle;
import android.provider.Settings;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 16/11/13
* desc : 定位相關工具類
*
*/
public class LocationUtils {
private static OnLocationChangeListener mListener;
private static MyLocationListener myLocationListener;
private static LocationManager mLocationManager;
private LocationUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 判斷Gps是否可用
*
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean isGpsEnabled(Context context) {
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/**
* 判斷定位是否可用
*
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean isLocationEnabled(Context context) {
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/**
* 打開Gps設置界面
*/
public static void openGpsSettings(Context context) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
/**
* 注冊
*
使用完記得調用{@link #unregister()}
*
需添加權限 {@code }
*
需添加權限 {@code }
*
需添加權限 {@code }
*
如果{@code minDistance}為0,則通過{@code minTime}來定時更新;
*
{@code minDistance}不為0,則以{@code minDistance}為準;
*
兩者都為0,則隨時刷新。
*
* @param minTime 位置信息更新周期(單位:毫秒)
* @param minDistance 位置變化最小距離:當位置距離變化超過此值時,將更新位置信息(單位:米)
* @param listener 位置刷新的回調接口
* @return {@code true}: 初始化成功
{@code false}: 初始化失敗
*/
public static boolean register(Context context, long minTime, long minDistance, OnLocationChangeListener listener) {
if (listener == null) return false;
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
mListener = listener;
if (!isLocationEnabled(context)) {
ToastUtils.showShortToastSafe(context, "無法定位,請打開定位服務");
return false;
}
String provider = mLocationManager.getBestProvider(getCriteria(), true);
Location location = mLocationManager.getLastKnownLocation(provider);
if (location != null) listener.getLastKnownLocation(location);
if (myLocationListener == null) myLocationListener = new MyLocationListener();
mLocationManager.requestLocationUpdates(provider, minTime, minDistance, myLocationListener);
return true;
}
/**
* 注銷
*/
public static void unregister() {
if (mLocationManager != null) {
if (myLocationListener != null) {
mLocationManager.removeUpdates(myLocationListener);
myLocationListener = null;
}
mLocationManager = null;
}
}
/**
* 設置定位參數
*
* @return {@link Criteria}
*/
private static Criteria getCriteria() {
Criteria criteria = new Criteria();
//設置定位精確度 Criteria.ACCURACY_COARSE比較粗略,Criteria.ACCURACY_FINE則比較精細
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//設置是否要求速度
criteria.setSpeedRequired(false);
// 設置是否允許運營商收費
criteria.setCostAllowed(false);
//設置是否需要方位信息
criteria.setBearingRequired(false);
//設置是否需要海拔信息
criteria.setAltitudeRequired(false);
// 設置對電源的需求
criteria.setPowerRequirement(Criteria.POWER_LOW);
return criteria;
}
/**
* 根據經緯度獲取地理位置
*
* @param context 上下文
* @param latitude 緯度
* @param longitude 經度
* @return {@link Address}
*/
public static Address getAddress(Context context, double latitude, double longitude) {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
try {
List
addresses = geocoder.getFromLocation(latitude, longitude, 1);if (addresses.size() > 0) return addresses.get(0);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 根據經緯度獲取所在國家
*
* @param context 上下文
* @param latitude 緯度
* @param longitude 經度
* @return 所在國家
*/
public static String getCountryName(Context context, double latitude, double longitude) {
Address address = getAddress(context, latitude, longitude);
return address == null ? "unknown" : address.getCountryName();
}
/**
* 根據經緯度獲取所在地
*
* @param context 上下文
* @param latitude 緯度
* @param longitude 經度
* @return 所在地
*/
public static String getLocality(Context context, double latitude, double longitude) {
Address address = getAddress(context, latitude, longitude);
return address == null ? "unknown" : address.getLocality();
}
/**
* 根據經緯度獲取所在街道
*
* @param context 上下文
* @param latitude 緯度
* @param longitude 經度
* @return 所在街道
*/
public static String getStreet(Context context, double latitude, double longitude) {
Address address = getAddress(context, latitude, longitude);
return address == null ? "unknown" : address.getAddressLine(0);
}
private static class MyLocationListener
implements LocationListener {
/**
* 當坐標改變時觸發此函數,如果Provider傳進相同的坐標,它就不會被觸發
*
* @param location 坐標
*/
@Override
public void onLocationChanged(Location location) {
if (mListener != null) {
mListener.onLocationChanged(location);
}
}
/**
* provider的在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數
*
* @param provider 提供者
* @param status 狀態
* @param extras provider可選包
*/
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
if (mListener != null) {
mListener.onStatusChanged(provider, status, extras);
}
switch (status) {
case LocationProvider.AVAILABLE:
LogUtils.d("onStatusChanged", "當前GPS狀態為可見狀態");
break;
case LocationProvider.OUT_OF_SERVICE:
LogUtils.d("onStatusChanged", "當前GPS狀態為服務區外狀態");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
LogUtils.d("onStatusChanged", "當前GPS狀態為暫停服務狀態");
break;
}
}
/**
* provider被enable時觸發此函數,比如GPS被打開
*/
@Override
public void onProviderEnabled(String provider) {
}
/**
* provider被disable時觸發此函數,比如GPS被關閉
*/
@Override
public void onProviderDisabled(String provider) {
}
}
public interface OnLocationChangeListener {
/**
* 獲取最后一次保留的坐標
*
* @param location 坐標
*/
void getLastKnownLocation(Location location);
/**
* 當坐標改變時觸發此函數,如果Provider傳進相同的坐標,它就不會被觸發
*
* @param location 坐標
*/
void onLocationChanged(Location location);
/**
* provider的在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數
*
* @param provider 提供者
* @param status 狀態
* @param extras provider可選包
*/
void onStatusChanged(String provider, int status, Bundle extras);//位置狀態發生改變
}
}
終點站
好了,終點站到了,如果對本次旅途滿意的話,請給五星好評哦,畢竟老司機犧牲了很多時間才換來這么一份工具類,如果該工具類依賴其他工具類,都可以在我的
總結
以上是生活随笔為你收集整理的android gps定位工具类,工具类之LocationUtils(定位工具类)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android弹出选择usb,andro
- 下一篇: webpack 多页面 html,web