百度地图骑行导航

最近做了一个简单的百度地图的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>

最终的效果如下

最后附上源码链接源码链接

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值