最近做了一个简单的百度地图的demo,查询地点,并且完成骑行导航。
首先在百度api上申请ak,下载对应jar包,为了方便后续开发,我下载的比较全。大家可以根据对应的需求自定义选取下载。
1.配置ak
首先在manifest里面,说明你的ak,以及百度地图必备的权限,导入jar包后,别忘了在grade文件里的android{}里补充一句。这样so文件才能正常运行。
sourceSets {
main() {
jniLibs.srcDirs = ['libs']
}
}
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="请输入AK" />
初始化百度sdk,最好单独写一个application类,这样比较方便。
public class Map2Application extends Application {
// @Override
// protected void attachBaseContext(Context base) {
// super.attachBaseContext(base);
// MultiDex.install(this);
// }
@Override public void onCreate() {
super.onCreate(); SDKInitializer.initialize(this);
}
}
2.初始化定位application类
在manifest里面注明初始化自定义的Application类即可,需要定位,还需注明一个定位的service
<service
android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
manifest总的清单如下
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hsy.map2">
<!-- 百度API所需权限 -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<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.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_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.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application android:name=".Map2Application"
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="你的AK" />
<activity android:name=".BNaviGuideActivity">
</activity>
<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>
3.地图具体实现
activity里面主要是三个模块,定位,geoCoding搜索,路线规划和导航。
3.1 定位
定位,用到百度地图的MyLocationListenner。
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) { return; }
MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius())//此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build();
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()));
startPt = ll;//起点是我的位置
}
}
public void onReceivePoi(BDLocation poiLocation) { } }
3.2 地理位置经纬度转换
然后是地理位置搜素,用到了gecoder类。
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG) .show();
return;
}
mBaiduMap.clear(); //获取地址并且在地图上标注
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()) .icon(BitmapDescriptorFactory .fromResource(R.drawable.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result .getLocation())); //终点位置是geocode编码查询的结果 endPt=result.getLocation();
}
3.3 初始化导航
然后初始化导航引擎,计算导航参数。
private void startBikeNavi() {
Log.d("View", "startBikeNavi");
mNaviHelper.initNaviEngine(this, new IBEngineInitListener() {
@Override
public void engineInitSuccess() {
Log.d("View", "engineInitSuccess");
if(startPt.toString()!=null&&endPt.toString()!=null)
param = new BikeNaviLaunchParam().stPt(startPt).endPt(endPt).vehicle(1);
routePlanWithParam();
}
@Override
public void engineInitFail() {
Log.d("View", "engineInitFail");
}
}
);
}
通过得到的参数param,规划路线,并跳转到导航页面。
private void routePlanWithParam() {
mNaviHelper.routePlanWithParams(param, new IBRoutePlanListener() {
@Override
public void onRoutePlanStart() {
Log.d("View", "onRoutePlanStart");
}
@Override
public void onRoutePlanSuccess() {
Log.d("View", "onRoutePlanSuccess");
Intent intent = new Intent();
intent.setClass(MainActivity.this, BNaviGuideActivity.class);
startActivity(intent);
}
@Override
public void onRoutePlanFail(BikeRoutePlanError error) {
Log.d("View", "onRoutePlanFail");
}
});
}
导航界面我主要是加了一些语音播报的信息在里面,大家可以调用百度的语音接口播报,我用的是讯飞的接口。
mNaviHelper.setRouteGuidanceListener(this, new IBRouteGuidanceListener() {
@Override
public void onRouteGuideIconUpdate(Drawable icon) { }
@Override
public void onRouteGuideKind(RouteGuideKind routeGuideKind) { }
@Override
public void onRoadGuideTextUpdate(CharSequence charSequence, CharSequence charSequence1) { }
@Override
public void onRemainDistanceUpdate(CharSequence charSequence) {
speech1.speechOnCloud("距离终点距离还有"+charSequence.toString()); }
@Override
public void onRemainTimeUpdate(CharSequence charSequence) {
speech1.speechOnCloud("距离到达终点时间还有"+charSequence.toString());
}
@Override
public void onGpsStatusChange(CharSequence charSequence, Drawable drawable) { }
@Override
public void onRouteFarAway(CharSequence charSequence, Drawable drawable) {
speech1.speechOnCloud("您可能已偏离导航"); }
@Override
public void onRoutePlanYawing(CharSequence charSequence, Drawable drawable) { }
@Override
public void onReRouteComplete() { speech1.speechOnCloud("已重新为您规划导航"); }
@Override
public void onArriveDest() { speech1.speechOnCloud("您已到达目的地"); }
@Override
public void onVibrate() { }
@Override
public void onGetRouteDetailInfo(BikeRouteDetailInfo bikeRouteDetailInfo) { }
});
最后补上xml界面的设计。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rel"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="90dp">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lin" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/city1"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:hint="城市"
android:text="" />
<EditText
android:id="@+id/poi1"
android:layout_width="170dp"
android:layout_height="wrap_content"
android:hint="具体位置"
android:text="" />
<!--点击事件写在了布局里边 android:onClick="searchButtonProcess" 点击事件的方法-->
<Button
android:id="@+id/search_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="searchButtonProcess"
android:text="查起点" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/city2"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:hint="城市"
android:text="" />
<EditText
android:id="@+id/poi2"
android:layout_width="170dp"
android:layout_height="wrap_content"
android:hint="具体位置"
android:text="" />
<!--点击事件写在了布局里边 android:onClick="searchButtonProcess" 点击事件的方法-->
<Button
android:id="@+id/search_end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="searchButtonProcess"
android:text="查终点" />
</LinearLayout>
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="95dp"
android:text="骑行导航"
android:layout_toRightOf="@+id/lin"
android:onClick="searchButtonProcess"
android:id="@+id/button" />
</RelativeLayout> <com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</LinearLayout>
最终的效果如下
最后附上源码链接源码链接