百度地圖什么的

來聊聊怎么接入百度地圖吧

百度地圖SDK接入

其實(shí)這個(gè)環(huán)境配置在百度官方的介紹上面已經(jīng)很詳細(xì)了,我也差不多是都是根據(jù)上面來的,只不過期間出現(xiàn)了很多問題,確實(shí)值得記錄下來,也可以和大家一起分享一下,因?yàn)槲乙恢庇玫腁ndroid Studio所以這里只重點(diǎn)說AS環(huán)境。。。
百度地圖環(huán)境配置

首先肯定是上百度地圖開發(fā)者平臺(tái)把他們家的Android SDK弄一套下來,其中的demo真的應(yīng)該好好看一下,很有用

根據(jù)各自的需要自行下載,真心建議多看看demo


百度Android地圖SDK下載

下載完成找到 libs 目錄,你會(huì)看到里面有很多東西,jni的so文件,以及很多jar包,壓縮包里面的東西是一些抽取出來的類(Overlay標(biāo)注物什么,以前好像沒有單獨(dú)抽取出來),要用到的時(shí)候直接弄(復(fù)制粘貼)進(jìn)項(xiàng)目就行了


libs包里面的內(nèi)容

好了開始創(chuàng)建你的項(xiàng)目吧,創(chuàng)建一個(gè)工程并將剛才解壓得到的libs包中的東西放進(jìn)來


工程中的配置

好吧,可能會(huì)發(fā)現(xiàn)我這兒libs下面的東西好像不一樣,確實(shí)不一樣,這里我的libs中的jar是一個(gè)4.0的集成jar包,而現(xiàn)在下載得到的是分開的好幾個(gè)jar,其實(shí)都一樣,還有如果有細(xì)心的去看了demo,就會(huì)發(fā)現(xiàn),我們下載得到的jar好像少了一個(gè)什么東西,對就是 locSDK_版本.jar,定位相關(guān)的東西,所以看demo真的很重要,如果你要用到定位的話就把它搞進(jìn)你的項(xiàng)目里面吧。千萬記得把添加進(jìn)去的jar包添加到項(xiàng)目中啊 (jar包上右鍵 Add to Library)

demo中的libs目錄

于是乎,從下面開始就可能是我們各種犯2的環(huán)節(jié)了

AndroidManifest.xml中的配置

<pre>
<h2>開啟權(quán)限</h2>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_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" />
</pre>

<pre>
<h2>添加開發(fā)者密鑰 和 服務(wù)的配置</h2>
<application...>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你自己申請的key" />

    <!--講道理,如果要涉及到定位之類的這個(gè)真的不能忘啊-->
    <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote"/>

</application>
</pre>

這里就聊一下關(guān)于申請key的步驟
官方介紹,你值得擁有
官方的介紹已經(jīng)非常詳細(xì)了,但是有很多細(xì)節(jié)需要注意
首先,你很有可能會(huì)發(fā)現(xiàn)這樣一個(gè)問題

命令行錯(cuò)誤提示

是不是覺得很心塞,好吧,檢查一下你的java環(huán)境配置好了沒有,或者重新配置一下你的java環(huán)境變量,JAVA_HOME,path,CLASS_PATH

其次,在使用 keytool -list -v -keystore debug.keystore 時(shí),獲得的SHA1只能用在調(diào)試過程中,如果有使用的 debug.keystore 然后打包了發(fā)布了APK就會(huì)發(fā)現(xiàn)使用APK安裝的up中地圖就不能正常顯示了。也就是說,使用 keytool -list -v -keystore debug.keystore 獲取的SHA1數(shù)字簽名在調(diào)試(也就是run app)時(shí)是沒有問題的,地圖能正常顯示。然而一旦需要打包發(fā)布APK時(shí),就不能使用debug.keystore的SHA1,而是需要根據(jù)打包APK的簽名文件重新獲得SHA1數(shù)字簽名,具體:keytool -list -v -keystore 簽名文件(XXXXX.jks)

最后,key不要弄錯(cuò)了啊

Hello BaiduMap

布局xml文件中的配置
<code><com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" /></code>

MainActivity
<code>public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳ApplicationContext
//注意該方法要再setContentView方法之前實(shí)現(xiàn)
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
}
}</code>
如果你在加載布局之前沒有初始化context信息SDKInitializer.initialize(getApplicationContext()),則很有可能會(huì) 出現(xiàn):Binary XML file line #8: Error inflating class com.baidu.mapapi.map.MapView錯(cuò)誤

找不到控件的類

其他生命周期方法
<code>
@Override protected void onDestroy() {
super.onDestroy();
//在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理
mMapView.onDestroy();
}
</code>
<code>
@Override protected void onResume() {
super.onResume();
//在activity執(zhí)行onResume時(shí)執(zhí)行mMapView. onResume (),實(shí)現(xiàn)地圖生命周期管理
mMapView.onResume();
}
</code>
<code>
@Override protected void onPause() {
super.onPause();
//在activity執(zhí)行onPause時(shí)執(zhí)行mMapView. onPause (),實(shí)現(xiàn)地圖生命周期管理
mMapView.onPause();
}
</code>

這下應(yīng)該可以看到地圖了吧,如果看不到就仔細(xì)檢查一下清單配置文件(AndroidManifest.xml)

百度地圖示例
開啟定位

private LocationClient client; //實(shí)現(xiàn)定位的核心類 private LatLng localPosition; //位置 private OverlayOptions localOverlay; //標(biāo)注物 //實(shí)現(xiàn)定位的類 client = new LocationClient(getApplicationContext()); //實(shí)現(xiàn)定位必須初始化SDK配置參數(shù) initLocation(); //注冊監(jiān)聽器 client.registerLocationListener(new MyLocationListener()); //啟動(dòng)定位功能 client.start();

//配置定位SDK參數(shù) private void initLocation(){ //定位的核心類 LocationClientOption option = new LocationClientOption(); //可選,默認(rèn)高精度,設(shè)置定位模式,高精度,低功耗,僅設(shè)備 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); option.setCoorType("bd09ll"); //可選,默認(rèn)gcj02,設(shè)置返回的定位結(jié)果坐標(biāo)系 int span=0; //定位的間隔 表示隔2秒定位一次(但是若為0,表示只定位一次) option.setScanSpan(span);//可選,默認(rèn)0,即僅定位一次,設(shè)置發(fā)起定位請求的間隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可選,設(shè)置是否需要地址信息,默認(rèn)不需要 option.setOpenGps(true);//可選,默認(rèn)false,設(shè)置是否使用gps option.setLocationNotify(false);//可選,默認(rèn)false,設(shè)置是否當(dāng)GPS有效時(shí)按照1S/1次頻率輸出GPS結(jié)果 option.setIsNeedLocationDescribe(true);//可選,默認(rèn)false,設(shè)置是否需要位置語義化結(jié)果,可以在BDLocation.getLocationDescribe里得到,結(jié)果類似于“在北京天安門附近” option.setIsNeedLocationPoiList(true);//可選,默認(rèn)false,設(shè)置是否需要POI結(jié)果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false);//可選,默認(rèn)true,定位SDK內(nèi)部是一個(gè)SERVICE,并放到了獨(dú)立進(jìn)程,設(shè)置是否在stop的時(shí)候殺死這個(gè)進(jìn)程,默認(rèn)不殺死 option.SetIgnoreCacheException(false);//可選,默認(rèn)false,設(shè)置是否收集CRASH信息,默認(rèn)收集 option.setEnableSimulateGps(false);//可選,默認(rèn)false,設(shè)置是否需要過濾GPS仿真結(jié)果,默認(rèn)需要 client.setLocOption(option); }

/** * 定位SDK監(jiān)聽函數(shù) */ public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 銷毀后不在處理新接收的位置 int locationType = location.getLocType(); Log.e(TAG,"開始定位啦啦啦啦" + locationType); if (location == null || mMapView == null) { return; } if (locationType != 161){ Toast.makeText(MainActivity.this, "定位失敗 !", Toast.LENGTH_SHORT).show(); } mPosition.append(location.getCity()); mCoordinate.append(location.getLatitude() + "," + location.getLongitude()); final String addrStr = location.getAddrStr(); final LatLng position = new LatLng(location.getLatitude(),location.getLongitude()); localPosition = position; //給當(dāng)前位置添加一個(gè)標(biāo)注 OverlayOptions options = new MarkerOptions() .position(position) .icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding)); localOverlay = options; //在地圖中添加標(biāo)志物 mBaiduMap.addOverlay(options); //綁定標(biāo)志物監(jiān)聽 mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { TextView textView = new TextView(MainActivity.this); textView.setText(addrStr); textView.setGravity(Gravity.CENTER); textView.setBackgroundColor(Color.rgb(150,150,150)); textView.setPadding(10, 5, 10, 5); InfoWindow infoWindow = new InfoWindow( BitmapDescriptorFactory.fromView(textView), position, -80, new InfoWindow.OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { mBaiduMap.hideInfoWindow(); } }); //顯示標(biāo)注的覆蓋物,即坐標(biāo)的詳細(xì)地址 mBaiduMap.showInfoWindow(infoWindow); return false; } }); MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此處設(shè)置開發(fā)者獲取到的方向信息,順時(shí)針0-360 .direction(100) .latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); Log.e(TAG,"位置確定" + location.getLatitude() + " " + location.getLongitude()); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(ll).zoom(18.0f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } } }

ok,定位需要注意的就是 MyLocationListener 中 onReceiveLocation(BDLocation location) 方法的重寫,還有就是需要 client.start() 開啟定位

有可能你還需要使用到POI興趣點(diǎn)檢索

private PoiSearch poiSearch; //興趣點(diǎn)檢索(POI) poiSearch = PoiSearch.newInstance(); poiSearch.setOnGetPoiSearchResultListener(this);

//這里需要實(shí)現(xiàn)POI檢索的接口 //重寫監(jiān)聽方法 @Override public void onGetPoiResult(PoiResult poiResult) { List<PoiInfo> allPoi = poiResult.getAllPoi(); if (null != allPoi && allPoi.size() > 0){ //在這里對搜索返回的結(jié)果進(jìn)行操作 }else { Toast.makeText(this, "沒有搜索到結(jié)果", Toast.LENGTH_LONG).show(); } } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { }

//獲取查詢列表啊//提交執(zhí)行周圍搜索 PoiNearbySearchOption option = new PoiNearbySearchOption(); option.location(localPosition) .keyword(newText) .radius(10000) .pageCapacity(20) .pageNum(0); poiSearch.searchNearby(option);

poiSearch.searchNearby(option)調(diào)用后會(huì)自動(dòng)調(diào)用POI檢索監(jiān)聽中的方法onGetPoiResult(PoiResult poiResult)

至于路線規(guī)劃什么的那些,其實(shí)官網(wǎng)都很詳細(xì)了,這里就以后再補(bǔ)充了

可能會(huì)遇到的問題

定位成功后點(diǎn)圖不顯示,而是現(xiàn)實(shí)淺藍(lán)紫色背景和一個(gè)定位藍(lán)色圓圈標(biāo)注,這個(gè)時(shí)候代碼應(yīng)該是沒問題的,檢查一下你的service配置好沒有,key是不是正確的,也有可能是jar包沖突了,可以嘗試換一下jar包

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容