第一步:在工程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); } }}