最近在学习使用百度导航,历经辛苦和个位大大的博客帮助,总算是出来了,但是存在一个bug让我百思不得其解。
在使用BaiduNaviManager.getInstance().launchNavigator()这个方法的时候 里面的OnJumpToNavi方法怎么都无法调用,因为我使用的是地理编码和反向地理编码把自己的地址和目标地址的坐标全计算出来的,所以使用了对象wait和锁,虽然第一次没有调用OnJumpToNavi方法,但是按了回退键再点击导航就可以了,非常神奇的bug
下面是代码
安卓开发中 使用百度导航遇到的问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- Black.C? 2016-07-06 02:13关注
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(); }
}
解决 无用评论 打赏 举报
悬赏问题
- ¥15 电力市场出清matlab yalmip kkt 双层优化问题
- ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
- ¥20 matlab yalmip kkt 双层优化问题
- ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
- ¥88 实在没有想法,需要个思路
- ¥15 MATLAB报错输入参数太多
- ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
- ¥15 有赏,i卡绘世画不出
- ¥15 如何用stata画出文献中常见的安慰剂检验图
- ¥15 c语言链表结构体数据插入