Android 使用LocationManger進行定位


在Android應用中,往往有獲取當前地理位置的需求,比如微信獲取附近的人需要獲取用戶當前的位置,不多說,直接上例子。

    public Location getLocation() {
        LocationManager locManger = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        List<String> providers_list = locManger.getAllProviders();
        for (String item : providers_list) {
            Location loc = locManger.getLastKnownLocation(item);
            if (loc != null) {
                return loc;
            }
        }
        String str1 = LocationManager.GPS_PROVIDER;
        String str2 = LocationManager.PASSIVE_PROVIDER;
        String str3 = LocationManager.NETWORK_PROVIDER;
        return null;
    }
  // 上面providers_list中的三個子項一般就為str1,str2,str3,這是常見的幾種手機支持的定位,需要注意的是有的手機好像只支持PASSIVE_PROVIDER{我在一個項目
  就是因為只寫了另外兩種而查不到地理位置}
  // 當沒有得到位置信息時,可以通過請求更新位置信息看是否能夠獲取位置信息
  loc.requestLocationUpdates(provider, minTime, minDistance, listener);// 四個參數分別為:provider名稱,請求間隔時間,更新最小距離,位置監聽器

Location的一些簡單用法

public void LocationMethod() {// Location常用方法簡介
        Location loc = getLocation();
        // loc.distanceTo(Location dest);float
        // loc.getAltitude();double 海拔高度
        // loc.getLatitude();double
        // loc.getLongitude();double
        // loc.getSpeed();float
    }

要想使用Location服務,還必須添加Location的權限:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
---------------------------------------------------修改-----------------------------------------------------------------------------
最近在項目中遇到一個問題,用上述的方法並不能很好的解決定位的問題,大多數手機用上述方法可以實現定位,但在有的手機上,仍然無法定位,最后只得使用百度定位SDK進行定位才得以解決;
一、添加一個百度定位服務及權限

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.INTERNET" />

二、編寫實現代碼

public class LocationManger {
    private LocationClient mLocClient;
    private BDLocationListener listener;
    private Context context;

    public LocationManger(Context context) {
        super();
        this.context = context;
    }

    public void getLocation() {
        mLocClient = new LocationClient(context);
        listener = new BDLocationListener() {
            @Override
            public void onReceivePoi(BDLocation arg0) {
            }

            @Override
            public void onReceiveLocation(BDLocation location) {
                if (location != null) {
                    Log.e("" + location.getLatitude(),
                            "" + location.getLongitude());
                    mLocClient.unRegisterLocationListener(listener);
                }
            }
        };
        mLocClient.registerLocationListener(listener);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setAddrType("all");// 返回的定位結果包含地址信息
        option.setCoorType("bd09ll");// 返回的定位結果是百度經緯度,默認值gcj02
        option.setScanSpan(5000);// 設置發起定位請求的間隔時間為5000ms
        option.disableCache(true);// 禁止啟用緩存定位
        option.setPoiNumber(5); // 最多返回POI個數
        option.setPoiDistance(1000); // poi查詢距離
        option.setPoiExtraInfo(true); // 是否需要POI的電話和地址等詳細信息
        mLocClient.setLocOption(option);
        mLocClient.start();
        if (mLocClient != null && mLocClient.isStarted()) {
            mLocClient.requestLocation();
        }
    }
}

BDLocationListener接口
BDLocationListener接口有2個方法需要實現: 1.接收異步返回的定位結果,參數是BDLocation類型參數。 2.接收異步返回的POI查詢結果,參數是BDLocation類型參數。在一般的程序中,只需要重寫第一個方法即可,里面返回的BDLocationo類型參數包含了經緯度信息; 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM