Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 百度地圖定位輔助教程

android 百度地圖定位輔助教程

編輯:關於Android編程

這裡使用講解的是androidStudio下開發android應用,實現百度地圖定位功能的輔助教程。
登入百度地圖API官方網站http://lbsyun.baidu.com/
在主頁中選擇開發->Android定位sdk,我們可以看到有很多的教程,包括教你獲取秘鑰,開發指南等等。具體我就不再贅述了,可以看上面的開發指南,這篇文章主要針對app中加入百度定位的一些細節方面的操作。
接著選擇相關下載->全部下載,進入之後可以看到如下界面。我們這裡只勾選全量定位即可。
這裡寫圖片描述

點擊下載開發包,當然你也可以下載示例代碼和參考類。
下載好開發包之後可以解壓看到如下目錄結構:

這裡寫圖片描述
有可能你會問這些是干嘛用的,其實這些都是動態鏈接庫,針對不同架構的android手機cpu百度編寫了不同的庫文件,目的是為了適配不同的CPU架構,如果你選擇了多個功能的開發包,會發現非常大,這時我們就得取捨,我們只要留下armeabi這個文件的庫就行了,基本上市面機子都ok。
接下來是將這些庫文件以及jar包導入到android工程中,如下操作,這裡就將百度地圖的動態鏈接庫全部導入到應用中吧,全部復制粘貼到libs目錄下:

這裡寫圖片描述

將jar包選擇右鍵,Add As Library,這樣成功將jar包導入,圖中沒有顯示庫文件,是因為樓主截圖不是同一個工程導致。正常將會顯示出庫文件,請諒解。

這裡寫圖片描述

當然你也可以通過Project Structure的方式將jar包導入,如下操作:

這裡寫圖片描述
這裡寫圖片描述

完成jar包的導入,可以看到在android工程的Gradle(Module:app)文件中看到如下的描述,這意味著,您的jar包導入成功了。
這裡寫圖片描述

下面是導入後的libs目錄結構:
這裡寫圖片描述

由於百度地圖定位需要用到動態鏈接庫,我們需要在Gradle(Module:app)文件中添加如下代碼:

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

這裡寫圖片描述

還需要在Manifests文件中聲明服務以及配置秘鑰,如下:
這裡寫圖片描述

這裡寫圖片描述
對了,別忘了還要聲明一些權限,詳情請看官方開發指南
好了這樣百度地圖定位的准備工作就基本做好了。現在你就可以看百度的圖的開發指南,進行代碼的編寫
官方開發指南地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc

作者在做自己項目時寫了個工具類,方便操作:

public class BDLocationUtils implements BDLocationListener {
    private static BDLocationUtils bdLocationUtils;

    public LocationClient mLocationClient = null;
    private String describe = "";
    private List locationPoiList = new ArrayList<>();
    private List locationList = new ArrayList<>();
    private String address;

    public static BDLocationUtils newInstance(Context context) {
        if (bdLocationUtils == null) {
            bdLocationUtils = new BDLocationUtils(context);
        }
        return bdLocationUtils;
    }

    public BDLocationUtils(Context context) {
        System.out.println("bdlocation");
        mLocationClient = new LocationClient(context);     //聲明LocationClient類
        initLocation();
        mLocationClient.registerLocationListener(this);    //注冊監聽函數
        mLocationClient.start();
    }

    /**
     * 初始化位置獲取設置
     */
    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
        );//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備
        option.setCoorType("bd09ll");//可選,默認gcj02;設置返回的定位結果坐標系
        // int span = 1000;
        //option.setScanSpan(span);//可選,默認0,即僅定位一次,設置發起定位請求的間隔需要大於等於1000ms才是有效的
        option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
        option.setOpenGps(false);//可選,默認false,設置是否使用gps
        option.setLocationNotify(false);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果
        option.setIsNeedLocationDescribe(false);//可選,默認false,設置是否需要位置語義化結果,可以在BDLocation.getLocationDescribe裡得到,結果類似於“在北京天安門附近”
        option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation.getPoiList裡得到
        option.setIgnoreKillProcess(false);//可選,默認true,定位SDK內部是一個SERVICE,並放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死
        option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集
        option.setEnableSimulateGps(true);//可選,默認false,設置是否需要過濾gps仿真結果,默認需要
        mLocationClient.setLocOption(option);

    }

    @Override
    public void onReceiveLocation(BDLocation location) {
        System.out.println("bdlocation listener。");
        //Receive Location
        StringBuffer sb = new StringBuffer(256);
//        sb.append("time : ");
//        sb.append(location.getTime());
//        sb.append("\nerror code : ");
//        sb.append(location.getLocType());
        sb.append("\nlatitude : ");
        sb.append(location.getLatitude());
        //latitude = location.getLatitude();
        MyApplication.location.setLatitude(location.getLatitude());//緯度
        sb.append("\nlontitude : ");
        sb.append(location.getLongitude());//經度
        MyApplication.location.setLatitude(location.getLongitude());
        //longitude = location.getLongitude();
//        sb.append("\nradius : ");
//        sb.append(location.getRadius());
        if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位結果
//            sb.append("\nspeed : ");
//            sb.append(location.getSpeed());// 單位:公裡每小時
//            sb.append("\nsatellite : ");
//            sb.append(location.getSatelliteNumber());
//            sb.append("\nheight : ");
//            sb.append(location.getAltitude());// 單位:米
//            sb.append("\ndirection : ");
//            sb.append(location.getDirection());// 單位度
            sb.append("\naddr : ");
            //sb.append(location.getAddrStr());
            address = location.getAddrStr();
            MyApplication.location.setAddress(address);
            sb.append(address);
            //Log.i("address:", address);
            sb.append("\ndescribe : ");
            sb.append("gps定位成功");
            describe = "gps定位成功";
        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 網絡定位結果
            sb.append("\naddr : ");
            address = location.getAddrStr();
            sb.append(address);
            MyApplication.location.setAddress(address);
            //運營商信息
            sb.append("\noperationers : ");
            sb.append(location.getOperators());
            sb.append("\ndescribe : ");
            sb.append("網絡定位成功");
            describe = "網絡定位成功";
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結果
            sb.append("\ndescribe : ");
            sb.append("離線定位成功,離線定位結果也是有效的");
            describe = "離線定位成功,離線定位結果也是有效的";
        } else if (location.getLocType() == BDLocation.TypeServerError) {
            sb.append("\ndescribe : ");
            sb.append("服務端網絡定位失敗,可以反饋IMEI號和大體定位時間到[email protected],會有人追查原因");
            describe = "服務端網絡定位失敗";
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
            sb.append("\ndescribe : ");
            sb.append("網絡不同導致定位失敗,請檢查網絡是否通暢");
            describe = "服務端網絡定位失敗";
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
            sb.append("\ndescribe : ");
            sb.append("無法獲取有效定位依據導致定位失敗,一般是由於手機的原因,處於飛行模式下一般會造成這種結果,可以試著重啟手機");
            describe = "無法獲取有效定位依據導致定位失敗,一般是由於手機的原因,處於飛行模式下一般會造成這種結果,可以試著重啟手機";
        }
        sb.append("\nlocationdescribe : ");
        sb.append(location.getLocationDescribe());// 位置語義化信息
        locationPoiList = location.getPoiList();// POI數據

        if (locationPoiList != null) {
            sb.append("\npoilist size = : ");
            sb.append(locationPoiList.size());
            locationList.clear();
            for (Poi p : locationPoiList) {
                sb.append("\npoi= : ");
                sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
                locationList.add(p.getName());
            }
            //通知list數據更新
        }
        //提示定位結果
        Log.i("BaiduLocationApiDem", sb.toString());
    }

    public void startLocation() {
        mLocationClient.start();
    }

    public void stopLocation() {
        mLocationClient.stop();
    }

    public List getLocationList() {
        return locationList;
    }

    public String getAddress() {
        return address;
    }

    public String getDescribe() {
        return describe;
    }
}

獲取您當前位置可能的地點:

bdLocationUtils = BDLocationUtils.newInstance(getApplicationContext());
bdLocationUtils.startLocation();
locationList = bdLocationUtils.getLocationList();

locationList存放著可能得地點
下面是獲取您當前位置的地點,屬於一個范圍地點,但不是具體的

bdLocationUtils.getAddress()

當你定位失敗的時候,你肯定想有提示一下,那麼可以調用如下代碼

String describe = bdLocationUtils.getDescribe();

這樣,describe就有你想要的信息。
注意,在你的activity中,finish時別忘了調用一下

bdLocationUtils.stopLocation();

以防止內存洩露。

如有問題,請留下您的腳印謝謝。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved