前面完成了定位功能,我们想得到定位地点的名称,发现目前能获取到的数据只有地点的经纬度。
我们可以通过GeoCorder来得到地点的名称。
首先实现OnGetGeoCoderResultListener接口。
添加一个GeoCorder对象:
GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
在onCreate方法中添加代码:
<span style="white-space:pre"> </span>// 初始化搜索模块,注册事件监听
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
前面我们在MyLocationListenner中实现了定位,我们可以得到当前位置的经纬度,下面就可以用GeoCorder的reverseGeoCode方法取得地点名称:
mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));
onGetReverseGeoCodeResult便接收到了相应的结果。
<span style="white-space:pre"> </span>/**
* Geo定位,经纬度获取地址
*/
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.clear();
int size = result.getPoiList().size();
if(size > 0){
List<String> data = new ArrayList<String>();
data.add(result.getAddress());
for (PoiInfo info : result.getPoiList()) {
String name = info.name;
data.add(name);
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.list, R.id.namelist, data);
listView.setAdapter(adapter);
}
}
这里顺便把地点的名称以及附近的POI信息添加到一个listview里。
--------------------------分割线------------------------------
定位以及获取名称完成了。接下来该实现导航功能了。
先给地图添加一个单击的监听:
OnMapClickListener listener = new OnMapClickListener() {
/**
* 地图单击事件回调函数
* @param point 点击的地理坐标
*/
public void onMapClick(LatLng point){
mBaiduMap.clear();
double lat = point.latitude;
double longit = point.longitude;
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
ptEnd = point;
if(ptEnd != null){
btnNav.setVisibility(Button.VISIBLE);
}
}
/**
* 地图内 Poi 单击事件回调函数
* @param poi 点击的 poi 信息
*/
@Override
public boolean onMapPoiClick(MapPoi poi) {
// TODO Auto-generated method stub
return false;
}
};
我们可以通过单击地图得到需要导航的目的地。
添加一个按钮启动导航,单击事件
<span style="white-space:pre"> </span>public void startNavEngine(View view) {
// 初始化导航引擎
if(mIsEngineInitSuccess){
launchNavigator2();
return;
}
BaiduNaviManager.getInstance().initEngine(this, getSdcardDir(),
mNaviEngineInitListener, ACCESS_KEY, mKeyVerifyListener);
dialog = new ProgressDialog(this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("初始化引擎中");
dialog.show();
}
<span style="white-space:pre"> </span>private String getSdcardDir() {
if (Environment.getExternalStorageState().equalsIgnoreCase(
Environment.MEDIA_MOUNTED)) {
return Environment.getExternalStorageDirectory().toString();
}
return null;
}
private NaviEngineInitListener mNaviEngineInitListener = new NaviEngineInitListener() {
public void engineInitSuccess() {
mIsEngineInitSuccess = true;
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
public void engineInitStart() {
}
public void engineInitFail() {
Looper.prepare();
Toast.makeText(MainActivity.this, "导航引擎初始化失败", 0).show();
Looper.loop();
}
};
private BNKeyVerifyListener mKeyVerifyListener = new BNKeyVerifyListener() {
@Override
public void onVerifySucc() {
// TODO Auto-generated method stub
// Toast.makeText(MainActivity.this, "key校验成功", Toast.LENGTH_LONG).show();
}
@Override
public void onVerifyFailed(int arg0, String arg1) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "key校验失败", Toast.LENGTH_LONG).show();
}
};
<span style="white-space:pre"> </span>Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
if(dialog.isShowing()){
dialog.dismiss();
}
Toast.makeText(MainActivity.this, "导航引擎初始化成功", 0).show();
launchNavigator2();
break;
default:
break;
}
super.handleMessage(msg);
}
};
以上检验了我们申请的key是否争取,引擎是否成功初始化。
/**
* 指定导航起终点启动GPS导航.起终点可为多种类型坐标系的地理坐标。
* 前置条件:导航引擎初始化成功
*/
private void launchNavigator2(){
//这里给出一个起终点示例,实际应用中可以通过POI检索、外部POI来源等方式获取起终点坐标
BNaviPoint startPoint = new BNaviPoint(ptCenter.longitude,ptCenter.latitude,
"软件园", BNaviPoint.CoordinateType.BD09_MC);
BNaviPoint endPoint = new BNaviPoint(ptEnd.longitude,ptEnd.latitude,
"指定点", 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(MainActivity.this, BNavigatorActivity.class);
intent.putExtras(configParams);
startActivity(intent);
}
@Override
public void onJumpToDownloader() {
}
});
}
好了,可以进入导航界面了,这里只是用了其中一种导航的方式,其他的可以自行测试~
PS:assets文件夹的东西记得copy进去。