android百度地图例子

hygok hygok     2023-02-03     603

关键词:

由于项目里用到了百度地图,路线规划的标题(比如“M235/362”)在百度地图API里面没有给出来,网上各种搜索都找不到别人发出来的方案,然后就只能自己组织标题了,相信很多人也遇到和我一样的问题,所以这里我把我的方案拿出来分享一下。先看一下效果图。

1,效果预览

  地图的UI参考了美团的。

2,代码分析

地图API已经给出的方法我就不多做分析了,网上也有很多例子分析百度地图API的,我主要分析一下网上比较难找到的一些方案。 如上图,每个路线的数据存放在RouteLine的子类里面,而RouteLine的title值都是空值,所以每条路线的名字在RouteLine里面是找不到的。公交、驾车、步行路线的数据是存放在RouteLine子类里面,比如公交的数据存放在TransitRouteLine里,TransitRouteLine给出了每条路线的详细行驶步骤。   上图打印了公交和驾车的每个步骤,有没有发现一些规律,我们可以从这些规律中组织标题,当然百度地图API开发人员如果改了那些步骤的语言组织方法的话,我们也得重新组织标题了。 公交的规律:每量公交前面都有“乘坐”两个字,所以可以判断字符串里有乘坐两字的就有公交换乘,公交名字后面都有一个逗号,然后是不是可以从乘坐后面截取字符串到逗号为止呢。如果有多辆车可以换乘的话API是这样返回公交的“m324(或m435,362)”,公交名字之间也有逗号,所以以逗号结束不可以,但可以以",经过"公交名字为结束符。
    private List<TransitRouteLine> addBusLinesTitle(List<TransitRouteLine> busLines)
        for(int i=0 ; i<busLines.size() ; i++)
            TransitRouteLine busLine = busLines.get(i);
            List<TransitRouteLine.TransitStep> steps = busLine.getAllStep();
            String title = "";
            for(int j=0 ; j<steps.size() ; j++)
                TransitRouteLine.TransitStep step = steps.get(j);
                String instructions = step.getInstructions();
                if(instructions != null && instructions.contains("乘坐"))
                    if(title.length() > 0)
                        title += ("→"+instructions.substring(2,instructions.indexOf(",经过")));
                        //下面被屏蔽的一行也可以使用
//                        title += ( "→"+instructions.split(",经过")[0].substring(2) );
                    else 
//                        title = instructions.split(",经过")[0].substring(2);
                        title = instructions.substring(2,instructions.indexOf(",经过"));
                    
                
            
            busLine.setTitle(title);
        
        return busLines;
    
上面的代码就是获取公交路线名字的方法,每个步骤的字符串用getInstructions()方法来获取。如果有很多个字符串有“乘坐”两字,代表要换乘多辆公交,然后把公交用连接符"→"连起来。 instructions.substring(2,instructions.indexOf(",经过"))这个方法时从2的下标截取到第一个",经过"的下标。 instructions.split(",经过")[0].substring(2)这个方法将字符串用",经过"分割成字符串数组,然后取第一个字符串,再从2的个下标截取到末尾。 标题组织好了后再放回RouteLine的title参数里面。   驾车和步行路线我只取了第一条显示出来,下面给出的是驾车、步行、自行车的标题组织方法。
    /**
     * 组织路线的名字,(格式:途径xxx和xxx),xxx取最近的两条路
     * @param steps
     * @param <T>
     * @return
     */
    private<T extends RouteStep> String getRouteTitle(List<T> steps)
        if(steps == null || steps.size()==0)
            return "";
        String title = "";
        Method method = null;
        try 
            method = steps.get(0).getClass().getDeclaredMethod("getInstructions");
         catch (NoSuchMethodException e) 
            e.printStackTrace();
        
        for(T step:steps)
            try 
                String ss = (String) method.invoke(step);
                if(ss.contains("进入"))
                    if(title.contains("途径"))
                        title += (" 和 " + ss.substring(ss.indexOf("进入")+2).split(",")[0]);
                        break;
                    else 
                        title += ("途径 " + ss.substring(ss.indexOf("进入")+2).split(",")[0]);
                    
                
             catch (InvocationTargetException e) 
                e.printStackTrace();
             catch (IllegalAccessException e) 
                e.printStackTrace();
            

        
        return title;
    
上面的用法是反射加泛型的方法。因为每个步骤的名字只能在RouteStep的子类才能获取,而且都是从每个子类的getInstructions()方法来获取步骤名字,所以不用反射的话只能驾车步行骑行都单独去写一个。路线名字只取了最近经过的两条路显示。 下面是一些需要用到的参数: routeLine.getDistance() :起点终点的距离,单位(米) routeLine.getDuration()  :起点到终点的时间,单位(秒)  

3,部分源码

百度地图基类:
/**
 * 定位、显示多个商家地址
 * Created by HuangYuGuang on 2016/7/11.
 */
public abstract class MapBaseFragment extends ABaseFragment 
    //地图相关
    private MapView mMapView = null;
    protected BaiduMap mBaiduMap;

    //定位相关
    private BitmapDescriptor mIconMaker;
    private LocationService locService;
    protected BDLocation myLocation = MapApplication.bdLocation;

    @Override
    protected int inflateContentView() 
        return R.layout.comm_lay_base_map;
    

    @Override
    protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) 
        super.layoutInit(inflater, savedInstanceSate);
        mMapView = (MapView) findViewById(R.id.bmapView);
        //隐藏缩放按键
        mMapView.showZoomControls(false);
        mBaiduMap = mMapView.getMap();
        mIconMaker = BitmapDescriptorFactory.fromResource(R.drawable.btu_gps_map);
        //地图显示的比例范围
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(15.0f));
        mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() 
            @Override
            public void onMapLoaded() 
                onMapLoadFinish();
            
        );
        if(canShowInfoWindow())
            initMarkerClickEvent();
            initMapClickEvent();
        
        if(canShowMyLocation())
            initMyLocation();
            findViewById(R.id.view_my_location).setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    showMyLocation();
                
            );
        
    

    private void initMapClickEvent()
    
        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() 

            @Override
            public boolean onMapPoiClick(MapPoi arg0) 
                return false;
            

            @Override
            public void onMapClick(LatLng arg0) 
                mBaiduMap.hideInfoWindow();
            
        );
    

    private void initMarkerClickEvent()
    
        // 对Marker的点击
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() 
            @Override
            public boolean onMarkerClick(final Marker marker) 
                // 获得marker中的数据
                final AddrInfo info = (AddrInfo) marker.getExtraInfo().get("markerInfo");

                InfoWindow mInfoWindow;
                // 将marker所在的经纬度的信息转化成屏幕上的坐标
                final LatLng ll = marker.getPosition();
                Point p = mBaiduMap.getProjection().toScreenLocation(ll);
                p.y -= 47;
                LatLng llInfo = mBaiduMap.getProjection().fromScreenLocation(p);
                mInfoWindow = new InfoWindow(InfoWindowView(info), llInfo,-15);
                mBaiduMap.showInfoWindow(mInfoWindow);
                return true;
            
        );
    

    public void addInfoOverlay(AddrInfo info)
        addInfosOverlay(Arrays.asList(info));
    

    /**
     * 在百度地图图层添加热点覆盖物
     */
    public void addInfosOverlay(List<AddrInfo> infos)
    
        mBaiduMap.clear();
        LatLng latLng = null;
        OverlayOptions overlayOptions = null;
        Marker marker = null;
        for (AddrInfo info : infos)
        
            // 位置
            latLng = new LatLng(info.getLatitude(), info.getLongitude());
            // 图标
            overlayOptions = new MarkerOptions().position(latLng)
                    .icon(mIconMaker).zIndex(5);
            marker = (Marker) (mBaiduMap.addOverlay(overlayOptions));
            Bundle bundle = new Bundle();
            bundle.putSerializable("markerInfo", info);
            marker.setExtraInfo(bundle);
        
        // 将地图移到到最后一个经纬度位置
        MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(latLng);
        mBaiduMap.setMapStatus(u);
    

    private void initMyLocation()
        locService = new LocationService(getActivity());
        LocationClientOption mOption = locService.getDefaultLocationClientOption();
        mOption.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
        mOption.setCoorType("bd09ll");
        locService.setLocationOption(mOption);
        locService.registerListener(listener);
        locService.start();
    

    /***
     * 定位结果回调,在此方法中处理定位结果
     */
    BDLocationListener listener = new BDLocationListener() 
        @Override
        public void onReceiveLocation(BDLocation location) 
            // map view 销毁后不在处理新接收的位置
            if (location == null || location.getLatitude() == 4.9E-324 || mMapView == null) 
                return;
            
            myLocation = location;
            MapApplication.bdLocation = location;
            MyLocationData locData = new MyLocationData.Builder()
                    //去掉光圈
//                    .accuracy(location.getRadius())
                    .accuracy(0)
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
        
    ;

    private void showMyLocation()
        LatLng ll = new LatLng(myLocation.getLatitude(), myLocation.getLongitude());
        MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(15.0f));
        mBaiduMap.animateMapStatus(u);
    

    public void useOtherMap(AddrInfo addrInfo)
        useOtherMap(addrInfo.getLatitude(), addrInfo.getLongitude(), addrInfo.getName());
    

    /**
     * 传入的坐标为百度坐标
     * @param latitude
     * @param longitude
     * @param name
     */
    public void useOtherMap(double latitude,double longitude,String name)
        Gps gps = PositionUtil.bd09_To_Gps84(latitude, longitude);
        Uri mUri = Uri.parse(String.format("geo:%s,%s?q=%s",gps.getWgLat(),gps.getWgLon(),name));
        Intent mIntent = new Intent(Intent.ACTION_VIEW,mUri);
        try 
            startActivity(mIntent);
        catch (Exception e)
            ToastUtil.showMsg("找不到手机地图软件。");
        
    

    /**
     * 需要重写InfoWindow的就重写该方法
     * @param addrInfo
     * @return
     */
    protected View InfoWindowView(final AddrInfo addrInfo)
        if(addrInfo == null) return null;
        // 生成一个TextView用户在地图中显示InfoWindow
        TextView textView = new TextView(getActivity());
        textView.setBackgroundResource(R.drawable.location_tips);
        textView.setPadding(30, 20, 30, 50);
        textView.setText(addrInfo.getName());
        textView.setTextColor(0xFFFFFFFF);
        textView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                onInfoWindowClick(addrInfo);
            
        );
        return textView;
    

    /**
     * 是否显示我当前的位置
     * @return
     */
    protected boolean canShowMyLocation()
        return true;
    

    /**
     * 点击出现标InfoWindow
     * @return
     */
    protected boolean canShowInfoWindow()
        return false;
    

    /**
     * 可以重写该方法重写InfoWindow的点击事件
     * @param addrInfo
     */
    protected void onInfoWindowClick(AddrInfo addrInfo)
        useOtherMap(addrInfo.getLatitude(),addrInfo.getLongitude(),addrInfo.getName());
    

    /**
     * 有些操作必须放在map加载完成后
     */
    protected void onMapLoadFinish()

    @Override
    public void onStart()
    
        mBaiduMap.setMyLocationEnabled(true);
        super.onStart();
    

    @Override
    public void onStop()
    
        mBaiduMap.setMyLocationEnabled(false);
        super.onStop();
    

    @Override
    public void onDestroy()
    
        super.onDestroy();
        if(locService != null)
            locService.unregisterListener(listener);
            locService.stop();
        
        mMapView.onDestroy();
        mIconMaker.recycle();
        mMapView = null;
    

    @Override
    public void onResume()
    
        super.onResume();
        mMapView.onResume();
    

    @Override
    public void onPause()
    
        super.onPause();
        mMapView.onPause();
    
  获取路线规划列表
/**
 * 路线列表
 * Created by HuangYuGuang on 2016/7/12.
 */
@SuppressLint("ValidFragment")
public class RouteLinesFragment extends Fragment 
    private RoutePlanSearch mSearch = null;
    private AddrInfo mAddrInfo;
    private BDLocation myLocation = MapApplication.bdLocation;
    private PlanNode stNode;
    private PlanNode enNode;

    private ListView listView;
    private ViewGroup rootView;
    public enum RoutePlanType
        bus,        //公交路线查询
        driving,    //驾车路线查询
        walking     //步行路线查询
    

    public RouteLinesFragment(AddrInfo addrInfo, RoutePlanType type) 
        Bundle bundle = new Bundle();
        bundle.putSerializable("whereToGo", addrInfo);
        bundle.putSerializable("routeType",type);
        setArguments(bundle);
    

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        rootView = (ViewGroup) View.inflate(getActivity(), R.layout.hyg_ui_route_lines,null);
        listView = (ListView) rootView.findViewById(R.id.listView);
        mAddrInfo = (AddrInfo) getArguments().getSerializable("whereToGo");
        initPlan();
        searchRoutePlan();
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
                RoutePlanAdapter adapter = (RoutePlanAdapter) listView.getAdapter();
                MapRoutePlanFreament.routeLine = adapter.getItem(position);
                MapRoutePlanFreament.lunch(getActivity(),null);
            
        );
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        return rootView;
    

    /**
     * 初始化线路规划
     */
    private void initPlan() 
        // 初始化搜索模块,注册事件监听
        mSearch = RoutePlanSearch.newInstance();
        mSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() 
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) 
                if (walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) 
                    loadFailAction();
                

                if (walkingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) 
                    loadSuccessAction();
                    WalkingRouteLine route = walkingRouteResult.getRouteLines().get(0);
                    String title = getRouteTitle(route.getAllStep());
                    route.setTitle(title.length()>0?title:"步行");
                    listView.setAdapter(new RoutePlanAdapter<WalkingRouteLine>(getActivity(), Arrays.asList(route)));
                else 
                    loadFailAction();
                
            

            @Override
            public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) 
                if (transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) 
                    loadFailAction();
                
                //FIXME
                if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) 
                    loadSuccessAction();
                    List<TransitRouteLine> routeLines = transitRouteResult.getRouteLines();
                    listView.setAdapter(new RoutePlanAdapter<TransitRouteLine>(getActivity(),addBusLinesTitle(routeLines)));
                else 
                    loadFailAction();
                
            

            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) 
                if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) 
                    loadFailAction();
                

                if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) 
                    loadSuccessAction();
                    DrivingRouteLine route = drivingRouteResult.getRouteLines().get(0);
                    String title = getRouteTitle(route.getAllStep());
                    route.setTitle(title.length()>0?title:"驾车");
                    listView.setAdapter(new RoutePlanAdapter<DrivingRouteLine>(getActivity(), Arrays.asList(route)));
                else 
                    loadFailAction();
                
            

            @Override
            public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) 

            
        );
    

    /**
     * 组织路线的名字,(格式:途径xxx和xxx),xxx取最近的两条路
     * @param steps
     * @param <T>
     * @return
     */
    private<T extends RouteStep> String getRouteTitle(List<T> steps)
        if(steps == null || steps.size()==0)
            return "";
        String title = "";
        Method method = null;
        try 
            method = steps.get(0).getClass().getDeclaredMethod("getInstructions");
         catch (NoSuchMethodException e) 
            e.printStackTrace();
        
        for(T step:steps)
            try 
                String ss = (String) method.invoke(step);
                if(ss.contains("进入"))
                    if(title.contains("途径"))
                        title += (" 和 " + ss.substring(ss.indexOf("进入")+2).split(",")[0]);
                        break;
                    else 
                        title += ("途径 " + ss.substring(ss.indexOf("进入")+2).split(",")[0]);
                    
                
             catch (InvocationTargetException e) 
                e.printStackTrace();
             catch (IllegalAccessException e) 
                e.printStackTrace();
            

        
        return title;
    

    /**
     * 给公交路线添加名字
     */
    private List<TransitRouteLine> addBusLinesTitle(List<TransitRouteLine> busLines)
        for(int i=0 ; i<busLines.size() ; i++)
            TransitRouteLine busLine = busLines.get(i);
            List<TransitRouteLine.TransitStep> steps = busLine.getAllStep();
            String title = "";
            for(int j=0 ; j<steps.size() ; j++)
                TransitRouteLine.TransitStep step = steps.get(j);
                String instructions = step.getInstructions();
                if(instructions != null && instructions.contains("乘坐"))
                    if(title.length() > 0)
                        title += ("→"+instructions.substring(2,instructions.indexOf(",经过")));
                        //下面被屏蔽的一行也可以使用
//                        title += ( "→"+instructions.split(",经过")[0].substring(2) );
                    else 
//                        title = instructions.split(",经过")[0].substring(2);
                        title = instructions.substring(2,instructions.indexOf(",经过"));
                    
                
            
            busLine.setTitle(title);
        
        return busLines;
    

    private void searchRoutePlan()
        if(myLocation == null)
            loadFailAction("获取不到当前位置!");
            return;
        
        if(mAddrInfo == null)
            loadFailAction("找不到您要去的地址!");
            return;
        
        stNode = PlanNode.withLocation(new LatLng(myLocation.getLatitude(), myLocation.getLongitude()));
        enNode = PlanNode.withLocation(new LatLng(mAddrInfo.getLatitude(), mAddrInfo.getLongitude()));
        doingSearch();
    

    private void doingSearch()
        loadingAction();
        RoutePlanType type = (RoutePlanType) getArguments().getSerializable("routeType");
        if(type == RoutePlanType.bus)
            mSearch.transitSearch(new TransitRoutePlanOption().city(myLocation.getCity()).from(stNode).to(enNode));
        else if(type == RoutePlanType.driving)
            mSearch.drivingSearch(new DrivingRoutePlanOption().from(stNode).to(enNode));
        else if(type == RoutePlanType.walking)
            mSearch.walkingSearch(new WalkingRoutePlanOption().from(stNode).to(enNode));
    

    /**
     * 交换地点查询
     */
    public void exchangeSearch()
        if(stNode == null || enNode == null)
            return;
        PlanNode node = stNode;
        stNode = enNode;
        enNode = node;
        doingSearch();
    

    private void loadingAction()
        listView.setVisibility(View.GONE);
        rootView.findViewById(R.id.layoutLoading).setVisibility(View.VISIBLE);
        rootView.findViewById(R.id.layoutLoadFailed).setVisibility(View.GONE);
    

    private void loadFailAction()
        loadFailAction(null);
    

    private void loadFailAction(String msg)
        listView.setVisibility(View.GONE);
        if(msg != null && msg.length()>0)
            ((TextView)rootView.findViewById(R.id.tv_fail_msg)).setText(msg);
        rootView.findViewById(R.id.layoutLoading).setVisibility(View.GONE);
        rootView.findViewById(R.id.layoutLoadFailed).setVisibility(View.VISIBLE);
    

    private void loadSuccessAction()
        listView.setVisibility(View.VISIBLE);
        rootView.findViewById(R.id.layoutLoading).setVisibility(View.GONE);
        rootView.findViewById(R.id.layoutLoadFailed).setVisibility(View.GONE);
    

    @Override
    public void onDestroy() 
        mSearch.destroy();
        super.onDestroy();
    
  显示路线以及路线的详细步骤
/**
 * 路线规划
 * Created by HuangYuGuang on 2016/7/11.
 */
public class MapRoutePlanFreament extends MapBaseFragment 
    public static RouteLine routeLine;
//    private OverlayManager routeOverlay = null;

    private ListView listView;
    private ImageView ivUpDown;
    protected List<String> routeSteps;

    public static<T extends RouteLine> void lunch(Activity from, T route)
        Bundle bundle = new Bundle();
        bundle.putParcelable("whereToGo",route);
        FragmentContainerActivity.getInstance(false).launch(from,MapRoutePlanFreament.class,bundle);
    

    @Override
    protected int inflateContentView() 
        return R.layout.hyg_ui_storemap1;
    

    @Override
    protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) 
        super.layoutInit(inflater, savedInstanceSate);
        // 清除路线
//        if (routeOverlay != null) 
//            routeOverlay.removeFromMap();
//        
    

    @Override
    protected void onMapLoadFinish() 
//        Object o = getArguments().getParcelable("whereToGo");
        /**
         *RouteLine通过intent传过来会出现异常闪退,可能是RouteLine使用Parcelable序列化的原因(据说比Serializable性能高,内存开销小)。
         *把RouteLine设为静态变量保存在内存就能用,但手机内存回收时会有问题。
         */
        if(routeLine == null) return;

        RouteLine o = routeLine;
        if(o instanceof TransitRouteLine)
            TransitRouteLine routeLine = (TransitRouteLine) o;
            addTransitOverLay(routeLine);
            routeSteps = getRouteSteps(routeLine.getAllStep());
        else if(o instanceof DrivingRouteLine)
            DrivingRouteLine routeLine = (DrivingRouteLine) o;
            addDrivingOverLay(routeLine);
            routeSteps = getRouteSteps(routeLine.getAllStep());
        
        else if(o instanceof WalkingRouteLine)
            WalkingRouteLine routeLine = (WalkingRouteLine) o;
            addWalkingOverLay(routeLine);
            routeSteps = getRouteSteps(routeLine.getAllStep());
        

        setTextView(R.id.tv_name,routeLine.getTitle());
        setTextView(R.id.tv_time, RoutePlanAdapter.getRouteTimeStr(routeLine.getDuration()));
        setTextView(R.id.tv_distance,RoutePlanAdapter.getDistanceStr(routeLine.getDistance()));
        setOnClickListener(R.id.iv_back);
        setOnClickListener(R.id.linearLayout);
        ivUpDown = (ImageView) findViewById(R.id.iv_up_down);
        listView = (ListView) findViewById(R.id.listView);
        if(routeSteps != null && routeSteps.size()>0)
            listView.setAdapter(new RouteStepAdapter());
    

    private void addWalkingOverLay(WalkingRouteLine route)
        WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaiduMap);
        overlay.setData(route);
        overlay.addToMap();
        overlay.zoomToSpan();
    

    private void addTransitOverLay(TransitRouteLine route)
        TransitRouteOverlay overlay = new TransitRouteOverlay(mBaiduMap);
        overlay.setData(route);
        overlay.addToMap();
        overlay.zoomToSpan();
    

    private void addDrivingOverLay(DrivingRouteLine route)
        DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);
        overlay.setData(route);
        overlay.addToMap();
        overlay.zoomToSpan();
    

    /**
     * 获取路线的详细步骤
     * @param steps
     * @param <T>
     * @return
     */
    private<T extends RouteStep> List<String> getRouteSteps(List<T> steps)
        if(steps == null || steps.size()==0)
            return null;
        Method method = null;
        try 
            method = steps.get(0).getClass().getDeclaredMethod("getInstructions");
         catch (NoSuchMethodException e) 
            e.printStackTrace();
        
        List<String> stepStrs = new ArrayList<>();
        for(T step:steps)
            try 
                stepStrs.add((String) method.invoke(step));
             catch (InvocationTargetException e) 
                e.printStackTrace();
             catch (IllegalAccessException e) 
                e.printStackTrace();
            

        
        return stepStrs;
    

    @Override
    public void onViewClicked(View view) 
        super.onViewClicked(view);
        int i = view.getId();
        if (i == R.id.iv_back) 
            getActivity().finish();
        else if(i == R.id.linearLayout)
            if(listView.getVisibility() == View.VISIBLE)
                listView.setVisibility(View.GONE);
                ivUpDown.setImageResource(R.drawable.icon_map_up);
            else 
                listView.setVisibility(View.VISIBLE);
                ivUpDown.setImageResource(R.drawable.icon_map_dnow);
            
        
    

    class RouteStepAdapter extends BaseAdapter

        @Override
        public int getCount() 
            return routeSteps.size();
        

        @Override
        public Object getItem(int position) 
            return routeSteps.get(position);
        

        @Override
        public long getItemId(int position) 
            return position;
        

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            ViewHolder viewHolder;
            if(convertView == null)
                convertView = View.inflate(getActivity(),R.layout.hyg_item_route_step,null);

                viewHolder = new ViewHolder();
                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
                viewHolder.tvStep = (TextView) convertView.findViewById(R.id.tv_step);
                convertView.setTag(viewHolder);
            else 
                viewHolder = (ViewHolder) convertView.getTag();
            
            String step = routeSteps.get(position);
            viewHolder.tvStep.setText(step);
            if(routeLine instanceof TransitRouteLine)
                if(step.contains("步行") )
                    viewHolder.imageView.setImageResource(R.drawable.btu_pep2);
                else
                    viewHolder.imageView.setImageResource(R.drawable.btu_bus2);
            else if(routeLine instanceof DrivingRouteLine)
                viewHolder.imageView.setImageResource(R.drawable.btu_car2);
            else if(routeLine instanceof WalkingRouteLine)
                viewHolder.imageView.setImageResource(R.drawable.btu_pep2);
            
            return convertView;
        
    

    class ViewHolder
        public ImageView imageView;
        public TextView tvStep;
    

以上的fragment编程继承了ABaseFragment类,这个类是参考了AisenWeiBo的开源项目修改的,所以可能有些人看不懂,这里看不懂的下载我的例子看就明白了。对 AisenWeiBo项目框架感兴趣的可以去 https://github.com/wangdan/AisenWeiBo 看一下。
    点击下载源码

关于百度地图例子坑人的经验教训

先是把百度地图API样例下载来,折腾了几天,总算编译通过了。这时写以下几点注意的:通过java或androidstudio提供的工具,生成SHA1,然后将SHA1填入你自己帐号的控制台,并填入相应的包名,并最终生成AK,这个我想没有太多难度... 查看详情

android百度地图系列之地图初始化及定位

在Android应用中,很多时候需要地图功能,回顾过去写的项目和百度地图api,开始总结一下Android百度地图的实现。首先总结一下怎么开始一个Android百度地图功能。当使用百度地图的时候,提到一个appkey。“在使用百度地图SDK为您... 查看详情

echarts基于百度地图实现地图飞线

...现基于在线地图实现地图飞线:原例子MakeAPie-模拟迁徙+百度地图(1条消息)利用ECharts3来实现ECharts2实例中的模拟迁徙效果,即背景地图为百度地图。_GiScript的博客-CSDN博客效果图:申请key:[控制台|百度地图开放平台(baidu.com)][___baid... 查看详情

用百度地图api分析打交通大数据

百度地图API,文档不全,例子不细致。在网上还没有太多有用的例子。比如说下面几个需求的解决方案就找不到:1.如何用百度地图API查询一个地点的经纬度。2.如何用百度地图通过一个经纬度查询商圈和地址。3.点击百度地图时... 查看详情

百度地图总结

公司做大数据展示需要用百度地图,使用的一点心得体会:1.首先是百度官网申请ak秘匙,我这里有两个http://lbsyun.baidu.com/apiconsole/key?application=key 2.百度地图例子参考多看http://lbsyun.baidu.com/index.php?title=jspopular/guide/widget3.百度... 查看详情

android百度地图上marker点移动要怎么处理

参考技术A如何在页面中调用百度地图,直接在你想要插入的页面上调用百度地图代码即可百度地图调用API地址:http://api.map.baidu.com/lbsapi/creatmap/index.html1.设置定位中心:直接搜索你要找的位置即可。调用百度地图代码2.设置地图... 查看详情

百度地图

一、简介百度地图API:1、简介:百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序2、功能:百度地图移动版API不仅包含构... 查看详情

用百度地图做了一个输入地址查询经纬度的小例子

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="jquery.js"></script></head><body><inputtype="text 查看详情

Android:使用百度地图在折线上添加箭头?

】Android:使用百度地图在折线上添加箭头?【英文标题】:Android:AddarrowheadsonpolylineusingBaidumap?【发布时间】:2020-08-2111:15:09【问题描述】:是否可以使用百度地图在折线上添加箭头?【问题讨论】:【参考方案1】:我找到了自... 查看详情

android关于百度地图定位失败

警告信息:galaxylibhostmissingmeta-data,makesureyouknowtherightwaytointegrategalaxy 解决办法:在AndroidManifest.xml文件中添加以下代码<service  android:name="com.baidu.location.f"  android:enabled="true"  android: 查看详情

appcan平台中使用百度地图,在android手机上百度地图无法手势缩放

我在appcan平台中使用百度地图,在android手机上只能对当前屏幕显示出来的那部分地图进行图片的缩放,并不是我想要的地图的缩放高手们有没有遇到过这样的问题,如何解决的?可能是我没有说清楚,我是做软件开发的,appcan... 查看详情

百度android地图如何获取地图中心点的经纬坐标

...能,获取周边地址;http://developer.baidu.com/map/index.php?title=androidsdk参考技术A百度android地图获取地图中心点的经纬坐标方法:1、在继承的BDLocationListener方法里面有这个方法publicvoidonReceiveLocation(BDLocationlocation)2、固定时间定位刷新坐... 查看详情

android地图开发非百度,google搜搜地图

请问有没有哪位做过手机地图开发,不是集成百度或者google的,是自己公司开发过地图的,给个思路,我们公司是做地图测绘的现在在pc端已经实现了地图功能,需要在手机端实现,求懂得大牛给一点思路本人没有做过谢谢了!... 查看详情

百度地图的全景地图实现的过程

最近要弄百度,实现web上地图拖动标注,停下来的时候,搜索地图位置上的全景图。用户点击全景图后,进入全景模式。这个需求看上去很简单。但是也费了我大半天的功夫。主要问题是1.百度地图没有完整的例子2.百度地图的... 查看详情

android编程怎么把gps坐标转换为百度地图坐标

参考技术A//将google地图、soso地图、aliyun地图、mapabc地图和amap地图//所用坐标转换成百度坐标CoordinateConverterconverter=newCoordinateConverter();converter.from(CoordType.COMMON);//sourceLatLng待转换坐标converter.coord(sourceLatLng);LatLngdesLatLng=converter.convert... 查看详情

如何调用百度地图api

参考技术A如何调用百度地图API1)下载百度地图移动版API(Android)开发包要在Android应用中使用百度地图API,就需要在工程中引用百度地图API开发包,这个开发包包含两个文件:baidumapapi.jar和libBMapApiEngine.so。2)申请APIKey和使用Googlem... 查看详情

android百度地图:百度地图运动轨迹纠偏去噪绑路之百度鹰眼(代码片段)

上一篇文章介绍了地图画轨迹的基本原理和实现。不难发现,当位置处于建筑物密集区、桥梁、高架桥下,gps信号较差时,画出来的轨迹效果会比较差。即使是在空旷地带,也难免会出现gps漂移的情况而造成轨迹... 查看详情

android百度地图怎么样初始化key

参考技术A恢复出厂设置 查看详情