中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中加入百度地圖SDK

發布時間:2020-08-07 01:21:55 來源:網絡 閱讀:397 作者:tlw90 欄目:移動開發

公司要做的項目需要使用到百度地圖。來學習一下關于百度地圖如何使用。
要使用百度地圖,需要先注冊一個百度賬號,獲取到地圖的SDK和秘鑰,導入到自己的項目中才能使用。

秘鑰和SDK

秘鑰的申請需要項目的包名和SHA1值。所以,需要先創建好項目再進行秘鑰的申請。

申請秘鑰

要申請秘鑰需要到百度地圖開放平臺申請。當然,百度有提供相應的教程,步驟我就不再列出來了。這邊需要注意的是創建應用的時候。

應用類型,因為我是在Android上開發的,所以選的是Android SDK。數字簽名(SHA1)的值使用的是簽名文件的SHA1的值,因為我沒有導出APK測試,直接運行到手機上,所以用的是測試證書,測試證書的SHA1可以在eclipse中的Window-preferences中的Android-Build獲取。包名則是在清單文件AndroidManifest.xml中的package。我創建的項目是FreeMap,包名是“com.jarvis.freemap”。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jarvis.freemap"    android:versionCode="1"    android:versionName="1.0" >

應用創建完畢后,就可以得到秘鑰了。

下載SDK

百度SDK下載

這個根據自己的需求下載相應的開發包就可以了。我因為想熟悉一下百度地圖,所以下了全部的開發包。開發包下完后是導入到項目的lib中的。

必要的配置

權限添加

要使用百度地圖,需要額權限可不少,權限需添加到清單文件中AndroidManifest.xml中,需要的權限有

<!-- 這個權限用于進行網絡定位 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 這個權限用于訪問GPS定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 用于訪問wifi網絡信息,wifi信息會用于進行網絡定位 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!-- 獲取運營商信息,用于支持提供運營商信息相關的接口 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 這個權限用于獲取wifi的獲取權限,wifi信息會用來進行網絡定位 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!-- 用于讀取手機當前的狀態 --><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- 寫入擴展存儲,向擴展卡寫入數據,用于寫入離線定位數據 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 訪問網絡,網絡定位需要上網 --><uses-permission android:name="android.permission.INTERNET" /><!-- SD卡讀取權限,用戶寫入離線定位數據 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

服務添加

需要添加一個百度的遠程服務到清單文件中的application中

<service
    android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote" ></service>

添加秘鑰

秘鑰也是在清單文件中的application中添加

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="your api-key" />

測試

百度提供的測試方法是創建一個mapView,運行看是否有生成地圖來測試是否配置正確。我們這邊要進行的是定位測試,以文本形式展現出來。官方有提供相應的demo可參考。

添加默認配置

對定位的一些基本參數進行配置,需要修改配置的話也是在這個類中進行修改。

public class LocationService {private LocationClient client = null;private LocationClientOption mOption,DIYoption;private Object  objLock = new Object(); 
/***
 * 
 * @param locationContext
 */public LocationService(Context locationContext){synchronized (objLock) {if(client == null){
client = new LocationClient(locationContext);
client.setLocOption(getDefaultLocationClientOption());
}
}
} 
/***
 * 
 * @param listener
 * @return
 */
 public boolean registerListener(BDLocationListener listener){boolean isSuccess = false;if(listener != null){
client.registerLocationListener(listener);
isSuccess = true;
}return  isSuccess;
} 
public void unregisterListener(BDLocationListener listener){if(listener != null){
client.unRegisterLocationListener(listener);
}
} 
/***
 * @param option
 * @return isSuccessSetOption
 */public boolean setLocationOption(LocationClientOption option){boolean isSuccess = false;if(option != null){if(client.isStarted())
client.stop();
DIYoption = option;
client.setLocOption(option);
}return isSuccess;
} 
public LocationClientOption getOption(){return DIYoption;
}/***
 * @return DefaultLocationClientOption
 */public LocationClientOption getDefaultLocationClientOption(){if(mOption == null){
mOption = new LocationClientOption();
mOption.setLocationMode(LocationMode.Hight_Accuracy);//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備mOption.setCoorType("bd09ll");//可選,默認gcj02,設置返回的定位結果坐標系,如果配合百度地圖使用,建議設置為bd09ll;mOption.setScanSpan(3000);//可選,默認0,即僅定位一次,設置發起定位請求的間隔需要大于等于1000ms才是有效的
    mOption.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
    mOption.setIsNeedLocationDescribe(true);//可選,設置是否需要地址描述
    mOption.setNeedDeviceDirect(false);//可選,設置是否需要設備方向結果
    mOption.setLocationNotify(false);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果
    mOption.setIgnoreKillProcess(true);//可選,默認true,定位SDK內部是一個SERVICE,并放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死   
    mOption.setIsNeedLocationDescribe(true);//可選,默認false,設置是否需要位置語義化結果,可以在BDLocation.getLocationDescribe里得到,結果類似于“在北京天安門附近”
    mOption.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation.getPoiList里得到
    mOption.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集}return mOption;
} 
public void start(){synchronized (objLock) {if(client != null && !client.isStarted()){
client.start();
}
}
}public void stop(){synchronized (objLock) {if(client != null && client.isStarted()){
client.stop();
}
}
}
 
}

主要邏輯

展示頁面上只添加一個Button和一個TextView兩個組件。在進行使用之前也需要一些必要的初始化,這里為了簡便,全部都整合到了同一個Activity類中,項目中使用的話,不建議這么寫。

初始化SDK

在使用之前需要先初始化一下百度sdk。這個初始化建議在自定義的Applicaition中進行。需要注意的是,初始化SDK必須在setContentView()之前進行。

locationService = new LocationService(getApplicationContext());
mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
SDKInitializer.initialize(getApplicationContext());

監聽的方法

這邊我是直接拷貝demo中的方法來使用,也可根據自己的需要進行修改。

private BDLocationListener mListener = new BDLocationListener() {
 
@Override
public void onReceiveLocation(BDLocation location) {if(null != location && location.getLocType() != BDLocation.TypeServerError){
StringBuffer sb = new StringBuffer(256);
sb.append("time: ");/**
 * 時間也可以使用systemClock.elapsedRealtime()方法 獲取的是自從開機以來,每次回調的時間;
 * location.getTime() 是指服務端出本次結果的時間,如果位置不發生變化,則時間不變
 */sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
sb.append("\nCountryCode : ");
sb.append(location.getCountryCode());
sb.append("\nCountry : ");
sb.append(location.getCountry());
sb.append("\ncitycode : ");
sb.append(location.getCityCode());
sb.append("\ncity : ");
sb.append(location.getCity());
sb.append("\nDistrict : ");
sb.append(location.getDistrict());
sb.append("\nStreet : ");
sb.append(location.getStreet());
sb.append("\naddr : ");
sb.append(location.getAddrStr());
sb.append("\nDescribe: ");
sb.append(location.getLocationDescribe());
sb.append("\nDirection(not all devices have value): ");
sb.append(location.getDirection());
sb.append("\nPoi: "); 
if(location.getPoiList() != null && !location.getPoiList().isEmpty()){for (int i = 0; i < location.getPoiList().size(); i++) {
Poi poi = (Poi) location.getPoiList().get(i);
sb.append(poi.getName() +";");
}
} 
if(location.getLocType() == BDLocation.TypeGpsLocation){//GPS定位結果sb.append("\nspeed : ");
sb.append(location.getSpeed());// 單位:km/hsb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
sb.append("\nheight : ");
sb.append(location.getAltitude());// 單位:米sb.append("\ndescribe : ");
sb.append("gps定位成功");
}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){// 網絡定位結果// 運營商信息sb.append("\noperationers : ");
sb.append(location.getOperators());
sb.append("\ndescribe : ");
sb.append("網絡定位成功");
}else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結果sb.append("\ndescribe : ");
sb.append("離線定位成功,離線定位結果也是有效的");
} else if (location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服務端網絡定位失敗,可以反饋IMEI號和大體定位時間到loc-bugs@baidu.com,會有人追查原因");
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("網絡不同導致定位失敗,請檢查網絡是否通暢");
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("無法獲取有效定位依據導致定位失敗,一般是由于手機的原因,處于飛行模式下一般會造成這種結果,可以試著重啟手機");
}
logMsg(sb.toString());
}
}
};

注冊與注銷監聽

用Activity的生命周期,對監聽進行注冊和注銷

/***
 * Stop location service
 */@Overrideprotected void onStop() {// TODO Auto-generated method stublocationService.unregisterListener(mListener); //注銷掉監聽locationService.stop(); //停止定位服務super.onStop();
}@Overrideprotected void onStart() {super.onStart();//location configlocationService.registerListener(mListener);//注冊監聽int type = getIntent().getIntExtra("from", 0);if(type == 0){
locationService.setLocationOption(locationService.getDefaultLocationClientOption());
}else if(type == 1){
locationService.setLocationOption(locationService.getOption());
}
 
getLocation.setOnClickListener(new OnClickListener() { 
@Overridepublic void onClick(View v) {if(getLocation.getText().toString().equals("單點定位")){
locationService.start();
getLocation.setText("定位ING");
}else{
locationService.stop();
getLocation.setText("單點定位");
}
}
});
}

獲取信息展現

public void logMsg(String str) {try {if (showLocation != null){
showLocation.setText(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

团风县| 丰城市| 定兴县| 桐城市| 南丰县| 东明县| 红桥区| 西城区| 隆回县| 永定县| 九龙坡区| 日照市| 福海县| 无棣县| 元谋县| 河曲县| 罗定市| 揭西县| 江达县| 康乐县| 岫岩| 安康市| 英吉沙县| 华池县| 古蔺县| 沂源县| 凉城县| 新宾| 蓬莱市| 繁峙县| 定安县| 蒙自县| 昆山市| 营口市| 南华县| 莒南县| 贡嘎县| 遵化市| 监利县| 鄂托克前旗| 栾城县|