android 接入百度地图sdk
生活随笔
收集整理的這篇文章主要介紹了
android 接入百度地图sdk
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目需求:
- 接入地圖
- 定位位置
- 設置百度地圖上的各種圖標
- 加載方格的問題
接入地圖
1.創建應用
接入的是百度地圖,首先去百度地圖開放平臺上添加應用。在http://lbsyun.baidu.com/apiconsole/key/create網址中創建應用,沒有百度賬號的,先注冊百度賬號。在創建應用頁面:應用名稱:隨意填寫;啟用服務:根據需求自行選擇;SHA1:在android studio右側的Gradle里面,選擇項目的Taks中的android中的signingReport,則在run中顯示所需的SHA1值和MD5的值。注:若沒有SHA1的值,先去給Build菜單里面Generate signing apk包名:在build.gradle里面,applicationId 為包名,若Manifest.xml中的包名與其不一致,取build.gradle里面的為準。創建完成后會生成AK值,在權限中需要填寫2.下載百度地圖jar包
把下載好的jar包復制到工程的libs中,然后右鍵選擇add as library 在main目錄下,創建jniLibs文件夾,將剩下的所有文件全部復制到該文件夾下在build.gradle中,android里面添加sourSet,這樣才能關聯到so文件sourceSets{main{jniLibs.srcDir 'libs'}}3.添加權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> //獲取設備網絡狀態,禁用后無法獲取網絡狀態<uses-permission android:name="android.permission.INTERNET"/> //網絡權限,當禁用后,無法進行檢索等相關業務<uses-permission android:name="android.permission.READ_PHONE_STATE" /> //讀取設備硬件信息,統計數據 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> //讀取系統信息,包含系統版本等信息,用作統計 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> //獲取設備的網絡狀態,鑒權所需網絡代理 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> //允許sd卡寫權限,需寫入地圖數據,禁用后無法顯示地圖 <uses-permission android:name="android.permission.WRITE_SETTINGS" /> //獲取統計數據 <uses-permission android:name="android.permission.GET_TASKS" /> //鑒權所需該權限獲取進程列表 <uses-permission android:name="android.permission.CAMERA" /> //使用步行AR導航 還需要在application里添加meta_data添加代碼<meta-data android:name="com.baidu.lbsapi.API_KEY"android:value="VvVpQ7Xukgv5Ko7cK3Cru4p32LoruNqZ"/> 其中name是固定的,value是在百度開發平臺創建應用生成的AK值4.在布局里添加mapView控件
在setContentView方法前面,添加代碼SDKInitializer.initialize(getApplicationContext());運行即可顯示地圖還可以在加上mapView與activity的生命周期綁定@Override protected void onDestroy() {super.onDestroy();mapView.onDestroy(); }@Override protected void onResume() {super.onResume();mapView.onResume(); } //在這里發現一個問題,添加這個方法的話旋轉就會有指南針,不添加的話,就不會有指南針???目前還沒有找到原因@Override protected void onPause() {super.onPause();mapView.onPause(); }定位
首先在application里面添加服務
//開啟定位功能一定要寫服務<service android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"/>然后創建一個LocationClient實例,調用registerLocationListner()方法注冊定位監聽器。獲取地理位置之后,會返回一個BDLocation對象,根據這個對象獲取定位的信息
private void initLocation() {LocationClient locationClient = new LocationClient(getApplicationContext());MyLocationListener myLocationListener = new MyLocationListener();locationClient.registerLocationListener(myLocationListener);locationClient.start(); }public class MyLocationListener implements BDLocationListener{@Overridepublic void onReceiveLocation(BDLocation bdLocation) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("獲取到的位置的維度:"+ bdLocation.getLatitude());stringBuilder.append("\n獲取到的位置的經度:"+ bdLocation.getLongitude());//得到獲取定位的類型int locType = bdLocation.getLocType();if (locType==BDLocation.TypeGpsLocation){stringBuilder.append("\n獲取位置的方式是:GPS");}else if (locType==BDLocation.TypeNetWorkLocation){stringBuilder.append("\n獲取位置的方式是:網絡");}//顯示地理位置mtextView.setText(stringBuilder.toString());} }獲取精確的地址:
//獲取定位結果bdLocation.getTime(); //獲取定位時間bdLocation.getLocationID(); //獲取定位唯一ID,v7.2版本新增,用于排查定位問題bdLocation.getLocType(); //獲取定位類型bdLocation.getLatitude(); //獲取緯度信息bdLocation.getLongitude(); //獲取經度信息bdLocation.getRadius(); //獲取定位精準度bdLocation.getAddrStr(); //獲取地址信息bdLocation.getCountry(); //獲取國家信息bdLocation.getCountryCode(); //獲取國家碼bdLocation.getCity(); //獲取城市信息bdLocation.getCityCode(); //獲取城市碼bdLocation.getDistrict(); //獲取區縣信息bdLocation.getStreet(); //獲取街道信息bdLocation.getStreetNumber(); //獲取街道碼(門牌號)bdLocation.getLocationDescribe(); //獲取當前位置描述信息bdLocation.getPoiList(); //獲取當前位置周邊POI信息bdLocation.getBuildingID(); //室內精準定位下,獲取樓宇IDbdLocation.getBuildingName(); //室內精準定位下,獲取樓宇名稱bdLocation.getFloor(); //室內精準定位下,獲取當前位置所處的樓層信息地圖顯示的顯然不是我想要的,需要的事直接定位到自己當前的位置,并在地圖上顯示我的位置。調用MapView的getMap方法獲取BaiduMap實例,就可以對地圖進行各種各樣的操作。因為默認顯示的地圖的位置是北京,所以我們想移動到自己的當前的位置并縮放大小怎么辦?百度SDK中提供了LatLng 類來獲取經緯度。它的構造方法接收兩個參數,一個緯度,一個經度。再得到緯度和經度之后、我們想設置地圖的經緯度和地圖,需要用到MapStatus 類通過MapStatus.Builder的方法設置經緯度和地圖。最后將設置好的屬性裝載到BaiduMap里面
為了使用animataMapStatus這個變量,加個布爾類型
if ((locType==BDLocation.TypeNetWorkLocation)||(locType==BDLocation.TypeGpsLocation)){if (IsFristLocate) {LatLng latLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());MapStatus.Builder builder = new MapStatus.Builder();//將位置移到定位的我的位置,zoom設置縮放級別數字越小,代表放大倍數越小,顯示范圍大。//參考網址:http://developer.baidu.com/map/android_refer/com/baidu/mapapi/map/MapStatus.Builder.html#zoom(float)builder.target(latLng).zoom(18.0f);MapStatus build = builder.build();MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(build);baidumap.animateMapStatus(mapStatusUpdate);IsFristLocate = false;}//只是完成了移到我的位置。還沒有顯示我的位置,百度SDK中有個MyLocationData的類,這個類封裝了設備當前的地理位置。調用它的Build()方法,生成一個實例。MyLocationData.Builder databuilder = new MyLocationData.Builder();databuilder.accuracy(bdLocation.getRadius());databuilder.direction(100);databuilder.latitude(bdLocation.getLatitude());databuilder.longitude(bdLocation.getLongitude());MyLocationData locationData = databuilder.build();baidumap.setMyLocationData(locationData);}對logo的設置
對地圖上的logo設置
MapView mapView = (MapView) findViewById (R.id.mapView);//可以對mapView設置mapView.showZoomControls(false); //設置縮放mapView.showScaleControl(false); //設置比例尺mapView.removeViewAt(1); //可以把地圖上的百度圖標移除,0時移除的是地圖//隱藏指南針,在加上onremue方法也是隱藏狀態UiSettings uiSettings = map.getUiSettings();uiSettings.setCompassEnabled(false);//自定義顯示位置圖標BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, bitmapDescriptor);baidumap.setMyLocationConfiguration(myLocationConfiguration);修改國測局與百度的定位偏差
把上面的MyLocationListener 類改成public class MyLocationListener implements BDLocationListener{@Overridepublic void onReceiveLocation(BDLocation bdLocation) {if (bdLocation==null|| mapView==null){return;}StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("獲取到的位置的維度:"+ bdLocation.getLatitude());stringBuilder.append("\n獲取到的位置的經度:"+ bdLocation.getLongitude());stringBuilder.append("\n獲取到的省份是:" + bdLocation.getProvince());stringBuilder.append("\n市:"+bdLocation.getCity());stringBuilder.append("\n區:"+ bdLocation.getDistrict());stringBuilder.append("\n街道:"+bdLocation.getStreet());int locType = bdLocation.getLocType();if (locType==BDLocation.TypeGpsLocation){stringBuilder.append("\n獲取位置的方式是:GPS");}else if (locType==BDLocation.TypeNetWorkLocation){stringBuilder.append("\n獲取位置的方式是:網絡");}mtextView.setText(stringBuilder.toString());if ((locType==BDLocation.TypeNetWorkLocation)||(locType==BDLocation.TypeGpsLocation)){if (IsFristLocate) {//將畫面移到定位的位置//此位置為國測局位置,要想準確需要轉化為百度地圖// LatLng latLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());LatLng latLng = CoordinateMath.gcj2bd(bdLocation);MapStatus.Builder builder = new MapStatus.Builder();builder.target(latLng).zoom(18);//zoom代表放大倍數MapStatus build = builder.build();MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(build);baidumap.animateMapStatus(mapStatusUpdate);IsFristLocate = false;}}//顯示定位的位置MyLocationData.Builder databuilder = new MyLocationData.Builder();databuilder.accuracy(bdLocation.getRadius());databuilder.direction(100);double longtitude = CoordinateMath.gcjLong2bd(bdLocation);double latitude = CoordinateMath.gcjLat2bd(bdLocation);databuilder.latitude(latitude);databuilder.longitude(longtitude);MyLocationData locationData = databuilder.build();baidumap.setMyLocationData(locationData);} }自定義CoordinateMath類
public class CoordinateMath {
}
加載方格問題
原因1:sha1值與包名是否正確,填寫的應用名稱與strings中的app_name標簽是否相符 原因2:復制過來的value值最后,是否有空格總結
以上是生活随笔為你收集整理的android 接入百度地图sdk的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 睡眼朦胧
- 下一篇: @RunWith的使用