转载请注明出处http://blog.csdn.net/u012324136/article/details/50826147
本人主要介绍安卓开发使用百度地图实现导航功能,用户可以输入当前位置和目的地,实现导航。
首先,我们需要当用户输入具体接到地址后将具体街道的地址转化为经度和纬度,然后实现定位,因此,首先来讲解一下地址解析,百度地图API提供Geocode类进行地址解析,我们可以通过Geocoder.getPoint()方法将一段地址描述转化为一个坐标(经度和纬度)具体代码如下
/**
* 一下代码通过具体地址获取经度纬度
* 起点地址获得经度纬度
* 暂时这样写,具体应用时在封装整理
*/
Geocoder gc = new Geocoder(RouteGuideDemo.this,Locale.CHINA);
List
addressList = null; try { addressList = gc.getFromLocationName(star_add, 1); if (!addressList.isEmpty()) { Address address_temp = addressList.get(0); //计算经纬度 double Latitude=address_temp.getLatitude(); //获得纬度 double Longitude=address_temp.getLongitude(); //获得经度 Star_Latitude=Latitude; Star_Longitude=Longitude; } }catch (IOException e) { e.printStackTrace(); }
BaiduNaviManager.getInstance().launchNavigator(this,
40.05087, 116.30142,"百度大厦", //起点纬度、经度、中文地址
39.90882, 116.39750,"北京天安门",//终点纬度、经度、中文地址
NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, //算路方式
true, //真实导航
BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略
new OnStartNavigationListener() { //跳转监听
@Override
public void onJumpToNavigator(Bundle configParams) {
Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class);
intent.putExtras(configParams);
startActivity(intent);
}
@Override
public void onJumpToDownloader() {
}
});
核心代码就这两步就可以实现导航功能了,接下展示一个Demo,具体来看看完整的实现过程
package com.baidu.navi.sdkdemo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.navisdk.BNaviPoint;
import com.baidu.navisdk.BaiduNaviManager;
import com.baidu.navisdk.BaiduNaviManager.OnStartNavigationListener;
import com.baidu.navisdk.comapi.routeplan.RoutePlanParams.NE_RoutePlan_Mode;
/**
* GPS导航Demo
*/
public class RouteGuideDemo extends Activity{
// private BNaviPoint mStartPoint = new BNaviPoint(116.30142, 40.05087,
// "百度大厦", BNaviPoint.CoordinateType.GCJ02);
private BNaviPoint mStartPoint = new BNaviPoint(117.150419, 39.111972,
"电子科技中心", BNaviPoint.CoordinateType.GCJ02);
private BNaviPoint mEndPoint = new BNaviPoint(116.39750, 39.90882,
"北京天安门", BNaviPoint.CoordinateType.GCJ02);
private List mViaPoints = new ArrayList();
private Button mBtnAddViaPoint;
//初始化参数,默认起点为小蜜蜂公司,终点为北京天安门
private double Star_Latitude=39.111972; //起点纬度
private double Star_Longitude=117.150419; //起点经度
private double end_Latitude=39.90882; //终点纬度
private double end_Longitude=116.39750; //终点经度
private MKSearch mMKSearch; //定义搜索服务类
private EditText star_cityEditText;
private EditText star_keyWordEditText;
private EditText end_cityEditText;
private EditText end_keyWordEditText;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_routeguide);
Button btnStartNavigation = (Button)findViewById(R.id.button_navigation);
//实例化输入框
star_cityEditText=(EditText)findViewById(R.id.edt_star_city);
star_keyWordEditText=(EditText)findViewById(R.id.edt_star_keyWord);
end_cityEditText=(EditText)findViewById(R.id.edt_end_city);
end_keyWordEditText=(EditText)findViewById(R.id.edt_end_keyWord);
btnStartNavigation.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mViaPoints.size() == 0) {
launchNavigator();
} else {
launchNavigatorViaPoints();
}
}
});
findViewById(R.id.start_nav2_btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (mViaPoints.size() == 0) {
launchNavigator2();
} else {
launchNavigatorViaPoints();
}
}
});
mBtnAddViaPoint = (Button) findViewById(R.id.add_via_btn);
mBtnAddViaPoint.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
addViaPoint();
}
});
}
private void addViaPoint() {
EditText viaXEditText = (EditText) findViewById(R.id.et_via_x);
EditText viaYEditText = (EditText) findViewById(R.id.et_via_y);
double latitude = 0, longitude = 0;
try {
latitude = Integer.parseInt(viaXEditText.getText().toString());
longitude = Integer.parseInt(viaYEditText.getText().toString());
} catch (NumberFormatException e) {
e.printStackTrace();
}
// 默认坐标系为GCJ
BNaviPoint viaPoint = new BNaviPoint(longitude/1e5, latitude/1e5,
"途经点" + (mViaPoints.size()+1));
mViaPoints.add(viaPoint);
Toast.makeText(this, "已添加途经点:" + viaPoint.getName(),
Toast.LENGTH_SHORT).show();
if (mViaPoints.size() >= 3) {
mBtnAddViaPoint.setEnabled(false);
}
}
/**
* 启动GPS导航. 前置条件:导航引擎初始化成功
*/
private void launchNavigator(){
//起点
String star_add=star_cityEditText.getText().toString().trim();
star_add=star_add+star_keyWordEditText.getText().toString().trim();
//终点
String end_add=end_cityEditText.getText().toString().trim();
end_add=end_add+end_keyWordEditText.getText().toString().trim();
/**
* 一下代码通过具体地址获取经度纬度
* 起点地址获得经度纬度
* 暂时这样写,具体应用时在封装整理
*/
Geocoder gc = new Geocoder(RouteGuideDemo.this,Locale.CHINA);
List addressList = null;
try {
addressList = gc.getFromLocationName(star_add, 1);
if (!addressList.isEmpty()) {
Address address_temp = addressList.get(0);
//计算经纬度
double Latitude=address_temp.getLatitude(); //获得纬度
double Longitude=address_temp.getLongitude(); //获得经度
Star_Latitude=Latitude;
Star_Longitude=Longitude;
}
}catch (IOException e) {
e.printStackTrace();
}
/**
* 一下代码通过具体地址获取经度纬度
* 终点地址获得经度纬度
* 暂时这样写,具体应用时在封装整理
*
*/
Geocoder gc2 = new Geocoder(RouteGuideDemo.this,Locale.CHINA);
List addressList2 = null;
try {
addressList2 = gc.getFromLocationName(end_add, 1);
if (!addressList2.isEmpty()) {
Address address_temp2 = addressList2.get(0);
//计算经纬度
double Latitude=address_temp2.getLatitude(); //获得纬度
double Longitude=address_temp2.getLongitude(); //获得经度
end_Latitude=Latitude;
end_Longitude=Longitude;
}
}catch (IOException e) {
e.printStackTrace();
}
BaiduNaviManager.getInstance().launchNavigator(this,
// 40.05087, 116.30142,"百度大厦",
// 39.111972,117.150419, "天津电子科技中心",
Star_Latitude,Star_Longitude,star_add, //起点纬度、经度、中文地址
end_Latitude,end_Longitude,end_add, //终点纬度、经度、中文地址
// 39.90882, 116.39750,"北京天安门",
NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, //算路方式
true, //真实导航
BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略
new OnStartNavigationListener() { //跳转监听
@Override
public void onJumpToNavigator(Bundle configParams) {
Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class);
intent.putExtras(configParams);
startActivity(intent);
}
@Override
public void onJumpToDownloader() {
}
});
}
/**
* 指定导航起终点启动GPS导航.起终点可为多种类型坐标系的地理坐标。
* 前置条件:导航引擎初始化成功
*/
private void launchNavigator2(){
//这里给出一个起终点示例,实际应用中可以通过POI检索、外部POI来源等方式获取起终点坐标
BNaviPoint startPoint = new BNaviPoint(116.307854,40.055878,
"百度大厦", BNaviPoint.CoordinateType.BD09_MC);
BNaviPoint endPoint = new BNaviPoint(116.403875,39.915168,
"北京天安门", BNaviPoint.CoordinateType.BD09_MC);
BaiduNaviManager.getInstance().launchNavigator(this,
startPoint, //起点(可指定坐标系)
endPoint, //终点(可指定坐标系)
NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, //算路方式
true, //真实导航
BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略
new OnStartNavigationListener() { //跳转监听
@Override
public void onJumpToNavigator(Bundle configParams) {
Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class);
intent.putExtras(configParams);
startActivity(intent);
}
@Override
public void onJumpToDownloader() {
}
});
}
/**
* 增加一个或多个途经点,启动GPS导航.
* 前置条件:导航引擎初始化成功
*/
private void launchNavigatorViaPoints(){
//这里给出一个起终点示例,实际应用中可以通过POI检索、外部POI来源等方式获取起终点坐标
// BNaviPoint startPoint = new BNaviPoint(113.97348, 22.53951, "白石洲");
// BNaviPoint endPoint = new BNaviPoint(113.92576, 22.48876, "蛇口");
// BNaviPoint viaPoint1 = new BNaviPoint(113.94104, 22.54343, "国人通信大厦");
// BNaviPoint viaPoint2 = new BNaviPoint(113.94863, 22.53873, "中国银行科技园支行");
List points = new ArrayList();
points.add(mStartPoint);
points.addAll(mViaPoints);
points.add(mEndPoint);
BaiduNaviManager.getInstance().launchNavigator(this,
points, //路线点列表
NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME, //算路方式
true, //真实导航
BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略
new OnStartNavigationListener() { //跳转监听
@Override
public void onJumpToNavigator(Bundle configParams) {
Intent intent = new Intent(RouteGuideDemo.this, BNavigatorActivity.class);
intent.putExtras(configParams);
startActivity(intent);
}
@Override
public void onJumpToDownloader() {
}
});
}
}
首页 导航页面
模拟器上运行效果如上,还自带语音播报导航功能。真实手机上效果会好很多,和百度地图客户端没什么区别
使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。
用户可以设置满足自身需求的定位依据:
若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。
定位精度
在使用百度定位SDKv4.0之前,我们要下载最新的库文件,下载地址:点击下载相关库文件,将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.0.jar文件拷贝到工程的libs目录下
参考文档:http://blog.csdn.net/xiaanming/article/details/11380619
最后附上源码下载链接:http://download.csdn.net/detail/u012324136/9455501