工具類之LocationUtils(定位工具類)

無須引入第三方定位,單純依賴v4包,如果只是需要簡單的定位,那么這份工具類可以很好地幫助到你,老司機不多說,辛酸的話語都留在了代碼里了,上效果演示

LocationDemo

Demo牛逼地顯示是當時查內存泄漏查吐血的功勞,具體坑可以查看相關Demo代碼,下面開始開車,嘟嘟嘟嘟~

站點

isGpsEnabled      : 判斷Gps是否可用
isLocationEnabled : 判斷定位是否可用
openGpsSettings   : 打開Gps設置界面
register          : 注冊
unregister        : 注銷
getAddress        : 根據(jù)經緯度獲取地理位置
getCountryName    : 根據(jù)經緯度獲取所在國家
getLocality       : 根據(jù)經緯度獲取所在地
getStreet         : 根據(jù)經緯度獲取所在街道

具體路線

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;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 16/11/13
 *     desc  : 定位相關工具類
 * </pre>
 */
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}: 是<br>{@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}: 是<br>{@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);
    }

    /**
     * 注冊
     * <p>使用完記得調用{@link #unregister()}</p>
     * <p>需添加權限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p>
     * <p>需添加權限 {@code <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>}</p>
     * <p>需添加權限 {@code <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>}</p>
     * <p>如果{@code minDistance}為0,則通過{@code minTime}來定時更新;</p>
     * <p>{@code minDistance}不為0,則以{@code minDistance}為準;</p>
     * <p>兩者都為0,則隨時刷新。</p>
     *
     * @param minTime     位置信息更新周期(單位:毫秒)
     * @param minDistance 位置變化最小距離:當位置距離變化超過此值時,將更新位置信息(單位:米)
     * @param listener    位置刷新的回調接口
     * @return {@code true}: 初始化成功<br>{@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;
        }
    }

    /**
     * 設置定位參數(shù)
     *
     * @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;
    }

    /**
     * 根據(jù)經緯度獲取地理位置
     *
     * @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<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
            if (addresses.size() > 0) return addresses.get(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根據(jù)經緯度獲取所在國家
     *
     * @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();
    }

    /**
     * 根據(jù)經緯度獲取所在地
     *
     * @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();
    }

    /**
     * 根據(jù)經緯度獲取所在街道
     *
     * @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 {
        /**
         * 當坐標改變時觸發(fā)此函數(shù),如果Provider傳進相同的坐標,它就不會被觸發(fā)
         *
         * @param location 坐標
         */
        @Override
        public void onLocationChanged(Location location) {
            if (mListener != null) {
                mListener.onLocationChanged(location);
            }
        }

        /**
         * provider的在可用、暫時不可用和無服務三個狀態(tài)直接切換時觸發(fā)此函數(shù)
         *
         * @param provider 提供者
         * @param status   狀態(tài)
         * @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狀態(tài)為可見狀態(tài)");
                    break;
                case LocationProvider.OUT_OF_SERVICE:
                    LogUtils.d("onStatusChanged", "當前GPS狀態(tài)為服務區(qū)外狀態(tài)");
                    break;
                case LocationProvider.TEMPORARILY_UNAVAILABLE:
                    LogUtils.d("onStatusChanged", "當前GPS狀態(tài)為暫停服務狀態(tài)");
                    break;
            }
        }

        /**
         * provider被enable時觸發(fā)此函數(shù),比如GPS被打開
         */
        @Override
        public void onProviderEnabled(String provider) {
        }

        /**
         * provider被disable時觸發(fā)此函數(shù),比如GPS被關閉
         */
        @Override
        public void onProviderDisabled(String provider) {
        }
    }

    public interface OnLocationChangeListener {

        /**
         * 獲取最后一次保留的坐標
         *
         * @param location 坐標
         */
        void getLastKnownLocation(Location location);

        /**
         * 當坐標改變時觸發(fā)此函數(shù),如果Provider傳進相同的坐標,它就不會被觸發(fā)
         *
         * @param location 坐標
         */
        void onLocationChanged(Location location);

        /**
         * provider的在可用、暫時不可用和無服務三個狀態(tài)直接切換時觸發(fā)此函數(shù)
         *
         * @param provider 提供者
         * @param status   狀態(tài)
         * @param extras   provider可選包
         */
        void onStatusChanged(String provider, int status, Bundle extras);//位置狀態(tài)發(fā)生改變
    }
}

終點站

好了,終點站到了,如果對本次旅途滿意的話,請給五星好評哦,畢竟老司機犧牲了很多時間才換來這么一份工具類,如果該工具類依賴其他工具類,都可以在我的Android開發(fā)人員不得不收集的代碼(持續(xù)更新中)中找到。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • 之前發(fā)過一個帖子,但是那個帖子有點問題我就重新發(fā)一個吧,下面的源碼是我從今年開始不斷整理源碼區(qū)和其他網站上的安卓例...
    passiontim閱讀 22,092評論 181 334
  • 燥熱的午后,后院卻是一片清涼,我一張冰涼的大石桌旁邊有四個小木樁,一位女孩左手卷著秀發(fā),右手在草稿紙上寫...
    夏萱0105閱讀 335評論 0 2
  • 上面一篇筆記簡單的介紹了一下 TCP 空閑掃描的原理,現(xiàn)在來動手操作了~ 恩,雖然 Nmap 也提供了一定的掃描空...
    椋鳥閱讀 1,475評論 0 3
  • 1、梁實秋:快樂是在心里,不假外求,求即往往不得,轉為煩惱。所謂快樂幸福乃是解除苦痛之謂。沒有苦痛便是幸福。
    春風拂面不如你閱讀 240評論 0 1

友情鏈接更多精彩內容