三方的通用流程
1、注册、创建应用、获取appkey
2、下载SDK并导入到项目中
3、配置清单文件、在application初始化数据
4、代码处理
百度地图流程:
1.登录帐号且创建应用:
如果没有百度地图开发者帐号,需要申请。然后登陆后,找到控制台,创建一个应用,获取SHA-1串号,最终获取appkey
创建应用:
找到应用管理
获取SHA1:
SHA1码 发布版和开发版
发布版和开发版,这两个建议都填写上,因为平时是使用开发版,到上线的使用发布版。
可以参考:http://lbsyun.baidu.com/index.php?title=FAQ/SHA1
a.通过androidstudio 命令获取SHA1:
Androidstudio顶部菜单栏 view
找到Terminal ,然后输入以下命令
keytool -list -v -keystore xxxxxxxx.android\debug.keystore -alias androiddebugkey
其中xxxxxxxx.android\debug.keystore 是自己的studio默认签名。如:C:\Users\chen.android\debug.keystore
输入以后会提示输入密码:默认密码是android
最后如下:
最后提交:记录appkey。
b.通过androidstudio gradle 获取SHA1:
右上角有个Gradle菜单栏,点击打开菜单,找到自己的项目如testmap,找到signingReport,双击执行。就会生成SHA1.这是最快捷的方式。
c.自己电脑黑窗口(命令控制台 :keytool)
keytool -list -v -keystore xxxxxxxx.android\debug.keystore -alias androiddebugkey
其中xxxxxxxx.android\debug.keystore 是自己的studio默认签名。如:C:\Users\chen.android\debug.keystore
输入以后会提示输入密码:默认密码是android
2.下载sdk和案例:
3.配置:
A.配置jar包 和so:
B.在app目录下的build.gradle文件中android块中配置sourceSets标签,如果没有使用该标签则新增,详细配置代码如下:
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
C. 配置AndroidManifest.xml文件:
在<application>中加入如下代码配置开发密钥(AK):
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
</application>
开发者 key 是自己创建的应用:
在<application/>外部添加如下权限声明:(依赖)
<!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
注:自Android6.0起部分权限的使用需要开发者在代码中动态申请。
D.新建一个自定义的Application,在其onCreate方法中完成SDK的初始化。示例代码如下:
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
在AndroidManifest.xml文件中声明该Application
E.创建地图Activity,管理MapView生命周期
注意:在项目中使用地图的时候要特别注意合理地管理地图生命周期,这非常重要。
以下示例代码简述对地图生命周期的管理:
public class MainActivity extends Activity {
private MapView mMapView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
}
通过添加View显示地图
百度地图SDK支持不用通过layout文件中添加MapView控件,直接在Java代码中添加MapView的方式来展示地图,示例如下:
1创建MapView对象
MapView mapView = new MapView(this);
2添加MapView对象
setContentView(mapView);
另外,在Java代码中添加MapView的方式支持通过BaiduMapOptions对象根据需求构造包含特定地图状态类型和控件显示状态的MapView对象。示例如下:
1定义BaiduMapOptions对象
BaiduMapOptions options = new BaiduMapOptions();
2设置需要的状态
//设置地图模式为卫星地图
options.mapType(BaiduMap.MAP_TYPE_SATELLITE);
3创建MapView对象
MapView mapView = new MapView(this, options);
4添加MapView对象
setContentView(mapView);
地图类型:
BaiduMap baiduMap = mvMap.getMap();
//普通地图 ,baiduMap是地图控制器对象
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//卫星地图
baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//空白地图
baiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
//开启交通图
baiduMap.setTrafficEnabled(true);
//开启热力图
baiduMap.setBaiduHeatMapEnabled(true);
//开启地图的定位图层
baiduMap.setMyLocationEnabled(true);
定位:
配置AndroidManifest.xml文件
加入如下权限使用声明依赖
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
mMapView = (MapView) findViewById(R.id.bmapView);
BaiduMap baiduMap = mvMap.getMap();
开启地图的定位图层
mBaiduMap.setMyLocationEnabled(true);
initLocation();
}
构造地图数据
我们通过继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView。
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//mapView 销毁后不在处理新接收的位置
if (location == null || mMapView == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
}
}
通过LocationClient发起定位
private void initLocation() {
//定位初始化
mLocationClient = new LocationClient(this);
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
//设置locationClientOption
mLocationClient.setLocOption(option);
//注册LocationListener监听器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
//开启地图定位图层
mLocationClient.start();
}
自己的定位
//如果已经定位了,只需要将地图界面移动到用户所在位置即可
//改变地图手势的中心点(地图的中心点)
//mLocation 是定位时获取到的用户位置信息对象
latitude = mLocation.getLatitude();
mLatitude.setText("纬度:"+ latitude);
longitude = mLocation.getLongitude();
mLongitude.setText("经度:"+ longitude);
LatLng latLng = new LatLng(latitude, longitude);
//改变地图手势中心点
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(latLng));
覆盖物:
//获取当前地图屏幕中心点的坐标
LatLng target = baiduMap.getMapStatus().target;
//定义maker 坐标点
LatLng point = new LatLng(target.latitude, target.longitude);
//构建marker图标
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.btn_icon_read);
//构建markerOption,用于在地图上添di加marker
MarkerOptions markerOptions = new MarkerOptions().position(point).icon(bitmapDescriptor);
//在地图上添加marker,并显示
baiduMap.addOverlay(markerOptions);
POI检索
//创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
//创建POI检索监听器
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
baiduMap.clear();
//创建PoiOverlay对象
PoiOverlay poiOverlay = new PoiOverlay(baiduMap);
//设置Poi检索数据
poiOverlay.setData(poiResult);
//将poiOverlay添加至地图并缩放至合适级别
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
}
}
@Override
public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
//废弃
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
};
//设置检索监听器
mPoiSearch.setOnGetPoiSearchResultListener(listener);
/**
* PoiCiySearchOption 设置检索属性
* city 检索城市
* keyword 检索内容关键字
* pageNum 分页页码
*/
/* mPoiSearch.searchInCity(new PoiCitySearchOption()
.city("北京") //必填
.keyword("美食") //必填
.pageNum(10));*/
/**
* POI周边检索
* 以天安门为中心,搜索半径100米以内的餐厅
*/
/* mPoiSearch.searchNearby(new PoiNearbySearchOption()
.location(new LatLng(39.915446, 116.403869))
.radius(10000)
.keyword("餐厅")
.pageNum(10));*/
/**
* POI区域检索(矩形区域检索)
* 设置矩形检索区域
*/
LatLngBounds searchBounds = new LatLngBounds.Builder()
.include(new LatLng( 39.92235, 116.380338 ))
.include(new LatLng( 39.947246, 116.414977))
.build();
/**
* 在searchBounds区域内检索餐厅
*/
mPoiSearch.searchInBound(new PoiBoundSearchOption()
.bound(searchBounds)
.keyword("餐厅"));
PoiOverlay 要复制百度地图原代码中:
要复制:poiOverLay 和Over LayManager 到项目中
步行导航:
配置AndroidManifest.xml文件
加入如下权限使用声明
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.CAMERA" />
将assets 中的BaiduBikeNavi_Resource_v6_3_0.png 添加上才能初始化成功
//1. 获取导航控制类
b// 引擎初始化
WalkNavigateHelper.getInstance().initNaviEngine(this, new IWEngineInitListener() {
@Override
public void engineInitSuccess() {
//引擎初始化成功的回调
routeWalkPlanWithParam();
Log.e(TAG, "engineInitSuccess: " );
}
@Override
public void engineInitFail() {
//引擎初始化失败的回调
Log.e(TAG, "engineInitFail: ");
}
});
private static final String TAG = "MapActivity";
// 2.创建routeWalkPlanWithParam方法:
private void routeWalkPlanWithParam() {
//起终点位置
LatLng startPt = new LatLng(40.047416, 116.312143);
LatLng endPt = new LatLng(40.048424, 116.313513);
//构造WalkNaviLaunchParam
mParam = new WalkNaviLaunchParam().stPt(startPt).endPt(endPt);
//发起算路
WalkNavigateHelper.getInstance().routePlanWithParams(mParam, new IWRoutePlanListener() {
@Override
public void onRoutePlanStart() {
//开始算路的回调
Log.e(TAG, "onRoutePlanStart: " );
}
@Override
public void onRoutePlanSuccess() {
//算路成功
//跳转至诱导页面
Intent intent = new Intent(MapActivity.this, WNaviGuideActivity.class);
startActivity(intent);
Log.e(TAG, "onRoutePlanSuccess: ");
}
@Override
public void onRoutePlanFail(WalkRoutePlanError walkRoutePlanError) {
//算路失败的回调
Log.e(TAG, "onRoutePlanFail: " );
}
});
}
//在清单文件声明
<activity android:name=".WNaviGuideActivity"></activity>
//3.创建WNaviGuideActivity 必须继承Acitivty
public class WNaviGuideActivity extends Activity {
private WalkNavigateHelper mNaviHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取WalkNavigateHelper实例
try {
mNaviHelper = WalkNavigateHelper.getInstance();
//获取诱导页面地图展示View
View view = mNaviHelper.onCreate(WNaviGuideActivity.this);
if (view != null) {
setContentView(view);
}
mNaviHelper.startWalkNavi(WNaviGuideActivity.this);
} catch (Exception ex) {
}
mNaviHelper.setWalkNaviStatusListener(new IWNaviStatusListener() {
/**
* 普通步行导航模式和步行AR导航模式的切换
* 导航模式
* @param
* @param walkNaviModeSwitchListener 步行导航模式切换的监听器
*/
@Override
public void onWalkNaviModeChange(int mode, WalkNaviModeSwitchListener walkNaviModeSwitchListener) {
mNaviHelper.switchWalkNaviMode(WNaviGuideActivity.this, mode, walkNaviModeSwitchListener);
}
@Override
public void onNaviExit() {
}
});
mNaviHelper.setRouteGuidanceListener(this, new IWRouteGuidanceListener() {
//诱导图标更新
@Override
public void onRouteGuideIconUpdate(Drawable drawable) {
}
//诱导类型枚举
@Override
public void onRouteGuideKind(RouteGuideKind routeGuideKind) {
}
/**
* 诱导信息
* @param charSequence 第一行显示的信息,如“沿当前道路”
* @param charSequence1 第二行显示的信息,比如“向东出发”,第二行信息也可能为空
*/
@Override
public void onRoadGuideTextUpdate(CharSequence charSequence, CharSequence charSequence1) {
}
//总的剩余距离
@Override
public void onRemainDistanceUpdate(CharSequence charSequence) {
}
//总的剩余时间
@Override
public void onRemainTimeUpdate(CharSequence charSequence) {
}
//GPS状态发生变化,来自诱导引擎的消息
@Override
public void onGpsStatusChange(CharSequence charSequence, Drawable drawable) {
}
//已经开始偏航
@Override
public void onRouteFarAway(CharSequence charSequence, Drawable drawable) {
}
//偏航规划中
@Override
public void onRoutePlanYawing(CharSequence charSequence, Drawable drawable) {
}
//重新算路成功
@Override
public void onReRouteComplete() {
}
//抵达目的地
@Override
public void onArriveDest() {
}
@Override
public void onIndoorEnd(Message message) {
}
@Override
public void onFinalEnd(Message message) {
}
//震动
@Override
public void onVibrate() {
}
});
}
//要写一下三个生命周期
@Override
protected void onResume() {
super.onResume();
mNaviHelper.resume();
}
@Override
protected void onPause() {
super.onPause();
mNaviHelper.pause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mNaviHelper.quit();
}
}
当初始化引擎不成功要在assets 中添加BaiduBikeNavi_Resource_v6_3_0.png
路径规划:
//创建路线规划检索实例
RoutePlanSearch mSearch = RoutePlanSearch.newInstance();
//创建路线规划检索结果监听器
OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
//创建WalkingRouteOverlay实例
WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);
if (walkingRouteResult.getRouteLines().size() > 0) {
//获取路径规划数据,(以返回的第一条数据为例)
//为WalkingRouteOverlay实例设置路径数据
overlay.setData(walkingRouteResult.getRouteLines().get(0));
//在地图上绘制WalkingRouteOverlay
overlay.addToMap();
}
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
}
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
}
};
//设置路线规划检索监听器
mSearch.setOnGetRoutePlanResultListener(listener);
//准备起终点信息
PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "西二旗地铁站");
PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "百度科技园");
//发起检索
mSearch.walkingSearch((new WalkingRoutePlanOption())
.from(stNode)
.to(enNode));
WalkingRouteOverlay的创建要复制百度地图原代码中:
要复制:walkingRouteOverlay到项目中
网友评论