第一步:在工程app/libs目錄下放入baidumapapi_vX_X_X.jar包,在src/main/目錄下新建jniLibs目錄,工程會自動加載src目錄下的so動態庫,放入libBaiduMapSDK_vX_X_X_X.so以下圖所示,注意jar和so的前3位版本號必須一致,而且保證使用一次下載的文件夾中的兩個文件,不能不一樣功能組件的jar或so交叉使用。 java
so的配置也能夠參考demo給出的目錄結構,以下圖所示,在app工程路徑下,新建libs,並在libs目錄下放入對應不一樣CPU架構的so文件。這樣工程並不會自動加載libs下的so,需在gradle編譯時,經過加入代碼: jniLibs.srcDir 'libs' 來講明so的路徑爲該libs路徑。 android
第二步:工程配置還須要把jar包集成到本身的工程中,如圖上圖所示,放入libs目錄下。對於每一個jar文件,右鍵-選擇Add As Library,導入到工程中。對應在build.gradle生成工程所依賴的jar文件說明,如圖所示: git
jar的配置也可參考eclipse方法,進行如下操做: api
菜單欄選擇 File —>Project Structure。 網絡
在彈出的Project Structure 對話框中, 選擇module, 而後點擊 Dependencies 選項卡. 架構
點擊綠色的加號選擇File dependency. 而後選擇要添加的jar包便可 完成上邊的操做後在app目錄下的build.gradle文件中,會有引入的類庫,如上圖所示。 app
集成地圖SDK的應用,在打包混淆的時候,須要注意與地圖SDK相關的方法不可被混淆。混淆方法以下:框架
-keep class com.baidu.** {*;} -keep class vi.com.** {*;} -dontwarn com.baidu.**
保證百度類不能被混淆,不然會出現網絡不可用等運行時異常 eclipse
Hello BaiduMapAndroid SDK 異步
Android開發工具備不少。在此,咱們推薦開發者使用Eclipse做爲本身的開發工具,本套開發指南也是針對Eclipse開發環境下進行編寫的。
百度地圖SDK爲開發者提供了便捷的顯示百度地圖數據的接口,經過如下幾步操做,便可在您的應用中使用百度地圖數據:
第一步:建立並配置工程(具體方法參見工程配置部分的介紹);
第二步:在AndroidManifest中添加開發密鑰、所需權限等信息;
(1)在application中添加開發密鑰
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="開發者 key" /> </application>
2)添加所需權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
第三步,在佈局xml文件中添加地圖控件;
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
第四步,在應用程序建立時初始化 SDK引用的Context 全局變量:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件以前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法以前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } }
注意:在SDK各功能組件使用以前都須要調用
SDKInitializer.initialize(getApplicationContext());,所以咱們建議該方法放在Application的初始化方法中
第五步,建立地圖Activity,管理地圖生命週期;
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件以前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法以前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 mMapView.onPause(); } }
完成以上步驟後,運行程序,便可在您的應用中顯示以下地圖:
以上的例子爲你們介紹瞭如何構建一個基礎的地圖頁面。地圖控件自v2.3.5版本起,支持多實例,即開發者能夠在一個頁面中創建多個地圖對象,而且針對這些對象分別操做且不會產生相互干擾。具體使用方法請參考MutiMapViewDemo中的相關介紹。
此外,自v2.3.5版本開始。MapView控件還增長了對Fragment框架的支持。用戶可使用SupportMapFragment控件完成相應框架內的開發工做(詳見MapFragmentDemo)。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.baidumap">
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 這個權限用於進行網絡定位-->
<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
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="onOhaXWOvV7RnacLgLTAbiEX1QrPpMtl" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"></service>
</application>
</manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.baidumap.MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/button_poi" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="poi檢索"
android:onClick="poiClick"
android:id="@+id/button_poi"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="個人位置"
android:onClick="mylocationClick"
android:id="@+id/mylocation"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button_poi"
android:layout_toEndOf="@+id/button_poi" />
</RelativeLayout>
MainActivity.java
package com.example.administrator.baidumap;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.Poi;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.search.core.PoiInfo;import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;import com.baidu.mapapi.search.poi.PoiCitySearchOption;import com.baidu.mapapi.search.poi.PoiDetailResult;import com.baidu.mapapi.search.poi.PoiResult;import com.baidu.mapapi.search.poi.PoiSearch;import java.util.List;public class MainActivity extends AppCompatActivity { MapView mMapView = null; private BaiduMap baiduMap; private PoiSearch poiSearch; public LocationClient mLocationClient = null; public BDLocationListener myListener = new MyLocationListener(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件以前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法以前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mMapView = (MapView) findViewById(R.id.bmapView); baiduMap = mMapView.getMap(); baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//設置爲普通地圖 //衛星地圖 // baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); baiduMap.setTrafficEnabled(true);//實時交通圖 mLocationClient = new LocationClient(getApplicationContext());//聲明LocationClient類 mLocationClient.registerLocationListener( myListener ); //註冊位置監聽函數 //添加一個標註覆蓋物 LatLng latLng = new LatLng(39.963175, 116.400244);//經緯度 BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); //建立一個圖層選項 OverlayOptions options = new MarkerOptions().position(latLng).icon(bitmapDescriptor); //把圖層選項添加到地圖上 baiduMap.addOverlay(options); //實例化POI檢索工具 poiSearch = PoiSearch.newInstance(); //POI檢索的結果監聽事件 OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { //獲取POI檢索結果 List<PoiInfo> poiInfos = poiResult.getAllPoi(); for (PoiInfo p : poiInfos) { System.out.println(p.address); System.out.println(p.city); System.out.println(p.phoneNum); BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.mipmap.biapji); //建立一個圖層選項 OverlayOptions options = new MarkerOptions().position(p.location).icon(bd); baiduMap.addOverlay(options); } } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { //獲取Place詳情頁檢索結果 } }; //設置POI檢索監聽者 poiSearch.setOnGetPoiSearchResultListener(poiListener); } public void poiClick(View view) { //發起一個檢索請求,異步的過程 poiSearch.searchInCity((new PoiCitySearchOption()) .city("北京") .keyword("美食") .pageNum(10)); }//請求個人位置信息 public void mylocationClick(View view) { initLocation(); mLocationClient.start(); mLocationClient.requestLocation();//發送請求 } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mMapView.onDestroy(); poiSearch.destroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 mMapView.onPause(); } /*設置定位參數包括:定位模式(高精度定位模式,低功耗定位模式和僅用設備定位模式),返回座標類型,是否打開GPS,是否返回地址信息、位置語義化信息、POI信息等等。 LocationClientOption類,該類用來設置定位SDK的定位方式,e.g.:*/ 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(true);//可選,默認false,設置是否使用gps option.setLocationNotify(true);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果 option.setIsNeedLocationDescribe(true);//可選,默認false,設置是否須要位置語義化結果,能夠在BDLocation.getLocationDescribe裏獲得,結果相似於「在北京天安門附近」 option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否須要POI結果,能夠在BDLocation.getPoiList裏獲得 option.setIgnoreKillProcess(false);//可選,默認true,定位SDK內部是一個SERVICE,並放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死 option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集 option.setEnableSimulateGps(false);//可選,默認false,設置是否須要過濾gps仿真結果,默認須要 mLocationClient.setLocOption(option); } //位置監聽器 public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) {//接收位置信息的回調方法 //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()); sb.append("\nlontitude : "); sb.append(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()); sb.append("\ndescribe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 網絡定位結果 sb.append("\naddr : "); sb.append(location.getAddrStr()); //運營商信息 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("沒法獲取有效定位依據致使定位失敗,通常是因爲手機的緣由,處於飛行模式下通常會形成這種結果,能夠試着重啓手機"); } sb.append("\nlocationdescribe : "); sb.append(location.getLocationDescribe());// 位置語義化信息 List<Poi> list = location.getPoiList();// POI數據 if (list != null) { sb.append("\npoilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("\npoi= : "); sb.append(p.getId() + " " + p.getName() + " " + p.getRank()); } } Log.i("BaiduLocationApiDem", sb.toString()); System.out.println(sb); BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromResource(R.mipmap.biapji); //緯度 經度 LatLng latLng=new LatLng(location.getLatitude(),location.getLongitude()); OverlayOptions options=new MarkerOptions().position(latLng).icon(bitmapDescriptor); baiduMap.addOverlay(options); } }}