Black.C? 2016-07-06 02:12 采纳率: 0%
浏览 2643

安卓开发中 使用百度导航遇到的问题

最近在学习使用百度导航,历经辛苦和个位大大的博客帮助,总算是出来了,但是存在一个bug让我百思不得其解。
在使用BaiduNaviManager.getInstance().launchNavigator()这个方法的时候 里面的OnJumpToNavi方法怎么都无法调用,因为我使用的是地理编码和反向地理编码把自己的地址和目标地址的坐标全计算出来的,所以使用了对象wait和锁,虽然第一次没有调用OnJumpToNavi方法,但是按了回退键再点击导航就可以了,非常神奇的bug
下面是代码

  • 写回答

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();
    }
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况