最近在学习使用百度导航,历经辛苦和个位大大的博客帮助,总算是出来了,但是存在一个bug让我百思不得其解。
在使用BaiduNaviManager.getInstance().launchNavigator()这个方法的时候 里面的OnJumpToNavi方法怎么都无法调用,因为我使用的是地理编码和反向地理编码把自己的地址和目标地址的坐标全计算出来的,所以使用了对象wait和锁,虽然第一次没有调用OnJumpToNavi方法,但是按了回退键再点击导航就可以了,非常神奇的bug
下面是代码
package com.guiguzudao.hyx.ui;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.Window;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeOption;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.navisdk.adapter.BaiduNaviManager;
import com.guiguzudao.hyx.R;
import com.guiguzudao.hyx.app.MyApp;
import com.guiguzudao.hyx.util.Consts;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
public class BaiduMapNavigationActivity extends Activity implements Consts {
@Bind(R.id.mv_maps)
MapView mvMaps;
private BaiduMap mBaiduMap;
private String SellerInfoAddress;
private double trrgetLat;
private double trrgetLng;
private String MyAddress;
private static BNRoutePlanNode sNode;
private static BNRoutePlanNode eNode;
private String APP_FOLDER_NAME = "GuiGUZUDAO";
public static final String ROUTE_PLAN_NODE = "routePlanNode";
private String mSDCardPath;
private String authinfo;
private GeoCoder eSearch;
private GeoCoder sSearch;
private Handler handler;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_baidu_map_navigation);
ButterKnife.bind(this);
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1001: //sNode 不为null
synchronized (sNode) {
while (eNode == null) {
try {
sNode.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (sNode != null && eNode != null) {
List<BNRoutePlanNode> list = new ArrayList<BNRoutePlanNode>();
list.add(sNode);
list.add(eNode);
boolean s = BaiduNaviManager.getInstance().launchNavigator(BaiduMapNavigationActivity.this, list, 1, true, new DemoRoutePlanListener(sNode));
Log.d("hyx", this.getClass() + "开始算路");
Log.d("hyx",""+s);
pd.dismiss();
}
}
break;
}
super.handleMessage(msg);
}
};
Looper.loop();
}
}).start();
initView();
if (initDirs()) {
initNavi();
}
RoutePlanToNavi();
}
public class DemoRoutePlanListener implements BaiduNaviManager.RoutePlanListener {
private BNRoutePlanNode mBNRoutePlanNode = null;
public DemoRoutePlanListener(BNRoutePlanNode node) {
mBNRoutePlanNode = node;
}
@Override
public void onJumpToNavigator() {
Log.d("hyx","demo has cross here!!!!!!");
Intent intent = new Intent(BaiduMapNavigationActivity.this,
BNDemoGuideActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(ROUTE_PLAN_NODE,
mBNRoutePlanNode);
intent.putExtras(bundle);
startActivity(intent);
}
@Override
public void onRoutePlanFailed() {
Log.i("hyx", "算路失败,请稍后重试");
pd.dismiss();
Toast.makeText(BaiduMapNavigationActivity.this,"算路失败,请稍后重试",Toast.LENGTH_SHORT).show();
}
}
private void initView() {
mBaiduMap = mvMaps.getMap();
// 普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
SellerInfoAddress = getIntent().getStringExtra(EXTRA_SELLER_INFO_ADDRESS);
LatLng ll = new LatLng(MyApp.lat,
MyApp.lng);
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
private void RoutePlanToNavi() {
String[] addressArray = SellerInfoAddress.split("市");
eSearch = GeoCoder.newInstance();
eSearch.setOnGetGeoCodeResultListener(listener);
//这是通过目的地的地址找坐标
eSearch.geocode(new GeoCodeOption()
.city(addressArray[0] + "市")
.address(addressArray[1]));
Log.i("hyx", "city: " + addressArray[0] + "address: " + addressArray[1]);
sSearch = GeoCoder.newInstance();
sSearch.setOnGetGeoCodeResultListener(listener);
//这是通过目的地的坐标找地址
sSearch.reverseGeoCode(new ReverseGeoCodeOption().location(new LatLng(MyApp.lat, MyApp.lng)));
}
OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//没有检索到结果
Log.d("hyx", "正向地理编码失败:" + result.error);
}
//获取地理编码结果
trrgetLat = result.getLocation().latitude;
trrgetLng = result.getLocation().longitude;
Log.i("hyx", "trrgetLat: " + trrgetLat + "&&" + "trrgetLng: " + trrgetLng);
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.drawable.icon_en);
LatLng latLng = new LatLng(trrgetLat, trrgetLng);
MarkerOptions overlayOptions = new MarkerOptions()
.position(latLng)
.zIndex(5)
.icon(mCurrentMarker);
mBaiduMap.addOverlay(overlayOptions);
eNode = new BNRoutePlanNode(trrgetLng, trrgetLat, SellerInfoAddress, null, BNRoutePlanNode.CoordinateType.GCJ02);
if (sNode != null) {
synchronized (sNode) {
if (eNode != null) {
sNode.notify();
}
}
}
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//没有找到检索结果
Log.i("hyx", "反向地理编码失败:" + result.error);
}
//给用户一个提示,正在工作中
if(pd==null){
pd = ProgressDialog.show(BaiduMapNavigationActivity.this, "", "正在规划地图中,请稍后...");
}
pd.show();
//获取反向地理编码结果
MyAddress = result.getAddress();
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.drawable.icon_st);
LatLng latLng = new LatLng(MyApp.lat, MyApp.lng);
MarkerOptions overlayOptions = new MarkerOptions()
.position(latLng)
.zIndex(5)
.icon(mCurrentMarker);
mBaiduMap.addOverlay(overlayOptions);
sNode = new BNRoutePlanNode(MyApp.lng, MyApp.lat, MyAddress, null, BNRoutePlanNode.CoordinateType.GCJ02);
handler.sendEmptyMessage(1001);
Log.i("hyx", "MyAddress: " + MyAddress);
}
};
private boolean initDirs() {
mSDCardPath = getSdcardDir();
if (mSDCardPath == null) {
return false;
}
File f = new File(mSDCardPath, APP_FOLDER_NAME);
if (!f.exists()) {
try {
f.mkdir();
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
private String getSdcardDir() {
if (Environment.getExternalStorageState().equalsIgnoreCase(
Environment.MEDIA_MOUNTED)) {
return Environment.getExternalStorageDirectory().toString();
}
return null;
}
// 导航 初始化引擎
private void initNavi() {
BaiduNaviManager.getInstance().init(this, mSDCardPath, APP_FOLDER_NAME,
new BaiduNaviManager.NaviInitListener() {
@Override
public void onAuthResult(int status, String msg) {
if (0 == status) {
authinfo = "key校验成功!";
} else {
authinfo = "key校验失败, " + msg;
}
BaiduMapNavigationActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(BaiduMapNavigationActivity.this, authinfo,
Toast.LENGTH_LONG).show();
}
});
}
public void initSuccess() {
Toast.makeText(BaiduMapNavigationActivity.this, "百度导航引擎初始化成功",
Toast.LENGTH_SHORT).show();
}
public void initStart() {
Toast.makeText(BaiduMapNavigationActivity.this, "百度导航引擎初始化开始",
Toast.LENGTH_SHORT).show();
}
public void initFailed() {
Toast.makeText(BaiduMapNavigationActivity.this, "百度导航引擎初始化失败",
Toast.LENGTH_SHORT).show();
}
}, null,null,null);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mvMaps.onDestroy();
eSearch.destroy();
sSearch.destroy();
mvMaps = null;
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mvMaps.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mvMaps.onPause();
}
}