开发者社区> 技术mix呢> 正文

Android 百度地图API 定位 导航

简介:
+关注继续查看

      看看这个利用百度地图定位并实现目的地导航的Demo。

首先看实现效果:

         Android 百度地图API 定位 导航 代码                        Android 百度地图API 定位 导航 代码

进 入后首先会得到当前位置,在地图上显示出来。在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路、 步行线路,在代码中都有具体凝视。另外,在控制台还输出了线路上每个节点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息。例如以下 图:

       Android 百度地图API 定位 导航 代码

 

接下来就看怎样实现了,首先。注冊百度开发人员账号,并进入百度地图API查看相关资料百度地图API,然后就是为须要增加地图的应用注冊APP KEY,注冊完后,下载百度地图jar文件。新建project。并导入就可以。以下看实现具体代码,在代码中有具体凝视:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
public class  NavigationDemoActivity extends MapActivity { 
    private String mMapKey = "注冊自己的key"
    private EditText destinationEditText = null
    private Button startNaviButton = null
    private MapView mapView = null
    private BMapManager mMapManager = null
    private MyLocationOverlay myLocationOverlay = null
    //onResume时注冊此listener,onPause时须要Remove,注意此listener不是Android自带的,是百度API中的 
    private LocationListener locationListener; 
    private MKSearch searchModel; 
    GeoPoint pt; 
       
    @Override 
    public void  onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
        setContentView(R.layout.main); 
        destinationEditText = (EditText) this.findViewById(R.id.et_destination); 
        startNaviButton = (Button) this.findViewById(R.id.btn_navi); 
           
        mMapManager = new BMapManager(getApplication()); 
        mMapManager.init(mMapKey, new MyGeneralListener()); 
        super.initMapActivity(mMapManager); 
           
        mapView = (MapView) this.findViewById(R.id.bmapsView); 
        //设置启用内置的缩放控件 
        mapView.setBuiltInZoomControls(true);   
        //设置在缩放动画过程中也显示overlay,默觉得不绘制 
//        mapView.setDrawOverlayWhenZooming(true); 
        //获取当前位置层 
        myLocationOverlay = new MyLocationOverlay(this, mapView); 
        //将当前位置的层加入到地图底层中 
        mapView.getOverlays().add(myLocationOverlay); 
           
        // 注冊定位事件 
        locationListener = new LocationListener(){ 
   
            @Override 
            public void  onLocationChanged(Location location) { 
                if (location != null){ 
                    //生成GEO类型坐标并在地图上定位到该坐标标示的地点 
                     pt = new GeoPoint((int)(location.getLatitude()*1e6), 
                            (int)(location.getLongitude()*1e6)); 
//                  System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); 
                    mapView.getController().animateTo(pt); 
                
            
        }; 
           
        //初始化搜索模块 
        searchModel = new MKSearch(); 
        //设置路线策略为最短距离 
        searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
        searchModel.init(mMapManager, new MKSearchListener() { 
            //获取驾车路线回调方法 
            @Override 
            public void  onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
                // 错误号可參考MKEvent中的定义 
                if (error != 0 || res == null) { 
                    Toast.makeText(NavigationDemoActivity.this"抱歉,未找到结果", Toast.LENGTH_SHORT).show(); 
                    return
                
                RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
                   
                // 此处仅展示一个方案作为演示样例 
                MKRoute route = res.getPlan(0).getRoute(0); 
                int distanceM = route.getDistance(); 
                String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000); 
                System.out.println("距离:"+distanceKm+"公里---节点数量:"+route.getNumSteps()); 
                for (int i = 0; i < route.getNumSteps(); i++) { 
                    MKStep step = route.getStep(i); 
                    System.out.println("节点信息:"+step.getContent()); 
                
                routeOverlay.setData(route); 
                mapView.getOverlays().clear(); 
                mapView.getOverlays().add(routeOverlay); 
                mapView.invalidate(); 
                mapView.getController().animateTo(res.getStart().pt); 
            
               
            //下面两种方式和上面的驾车方案实现方法一样 
            @Override 
            public void  onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
                //获取步行路线 
            
               
            @Override 
            public void  onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
                //获取公交线路 
            
               
            @Override 
            public void  onGetBusDetailResult(MKBusLineResult arg0, int arg1) { 
            
            @Override 
            public void  onGetAddrResult(MKAddrInfo arg0, int arg1) { 
            
            @Override 
            public void  onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { 
            
            @Override 
            public void  onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { 
            
        }); 
           
        startNaviButton.setOnClickListener(new OnClickListener() { 
               
            @Override 
            public void  onClick(View v) { 
                String destination = destinationEditText.getText().toString(); 
                   
                //设置起始地(当前位置) 
                MKPlanNode startNode = new MKPlanNode(); 
                startNode.pt = pt; 
                //设置目的地 
                MKPlanNode endNode = new MKPlanNode();  
                endNode.name = destination; 
                   
                //展开搜索的城市 
                String city = getResources().getString(R.string.beijing); 
//              System.out.println("----"+city+"---"+destination+"---"+pt); 
                searchModel.drivingSearch(city, startNode, city, endNode); 
                //步行路线 
//              searchModel.walkingSearch(city, startNode, city, endNode); 
                //公交路线 
//              searchModel.transitSearch(city, startNode, endNode); 
            
        }); 
           
    
       
    @Override 
    protected void  onResume() { 
        mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
        myLocationOverlay.enableMyLocation(); 
        myLocationOverlay.enableCompass(); // 打开指南针 
        mMapManager.start(); 
        super.onResume(); 
    
       
    @Override 
    protected void  onPause() { 
        mMapManager.getLocationManager().removeUpdates(locationListener); 
        myLocationOverlay.disableMyLocation();//显示当前位置 
        myLocationOverlay.disableCompass(); // 关闭指南针 
        mMapManager.stop(); 
        super.onPause(); 
    
   
    @Override 
    protected boolean  isRouteDisplayed() { 
        // TODO Auto-generated method stub 
        return false
    
       
    // 经常使用事件监听,用来处理通常的网络错误,授权验证错误等 
    class MyGeneralListener implements MKGeneralListener { 
            @Override 
            public void  onGetNetworkState(int iError) { 
                Log.d("MyGeneralListener""onGetNetworkState error is "+ iError); 
                Toast.makeText(NavigationDemoActivity.this"您的网络出错啦!

"

                        Toast.LENGTH_LONG).show(); 
            
   
            @Override 
            public void  onGetPermissionState(int iError) { 
                Log.d("MyGeneralListener""onGetPermissionState error is "+ iError); 
                if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) { 
                    // 授权Key错误: 
                    Toast.makeText(NavigationDemoActivity.this,  
                            "请在BMapApiDemoApp.java文件输入正确的授权Key!

"

                            Toast.LENGTH_LONG).show(); 
                
            
        
}
然后是布局文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"
   
    <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal"
   
        <TextView 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:textSize="18sp" 
            android:text="Destination:" /> 
   
        <EditText 
            android:id="@+id/et_destination" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" /> 
    </LinearLayout
       
    <Button  
        android:id="@+id/btn_navi" 
        android:layout_width="fill_parent" 
           android:layout_height="wrap_content" 
           android:text="Start navigate"/> 
   
    <com.baidu.mapapi.MapView 
        android:id="@+id/bmapsView" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:clickable="true" /> 
   
</LinearLayout>
AndroidMainifest.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.ericssonlabs" 
    android:versionCode="1" 
    android:versionName="1.0"
   
    <uses-sdk android:minSdkVersion="8" /> 
   
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission
    <uses-permission android:name="android.permission.INTERNET"></uses-permission
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>   
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission
       
    <supports-screens android:largeScreens="true" 
        android:normalScreens="true" android:smallScreens="true" 
        android:resizeable="true" android:anyDensity="true"/> 
    <uses-sdk android:minSdkVersion="3"></uses-sdk
   
    <application 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name"
        <activity 
            android:name=".NavigationDemoActivity" 
            android:label="@string/app_name"
            <intent-filter
                <action android:name="android.intent.action.MAIN" /> 
   
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter
        </activity
    </application
   
</manifest>

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android保存多张图片到本地
目录介绍 01.实际开发保存图片遇到的问题 02.直接用http请求图片并保存本地 03.用glide下载图片保存本地 04.如何实现连续保存多张图片 05.关于其他介绍 好消息 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等.
1027 0
Android 开发中的代码片段(3)地图操作相关
前言 收集常用的代码块,留存记录。此次代码块包含:唤起高德地图导航、唤起百度地图导航 代码 判断手机内安装的地图 /**判断是否安装目标应用*/ private boolean isInstallByread(String packageName) {...
1243 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
17756 0
百度地图API : 修改marker图标(icon)
百度地图API : 修改marker图标(icon)
67 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23786 0
【百度地图API】——如何让标注自动呈现在最佳视野内
原文:【百度地图API】——如何让标注自动呈现在最佳视野内 摘要:   “我有一堆标注,不规则的散落在地图的各个地方,我想把它们展示在一个最佳视野中,怎么办呢?”一位API爱好者咨询道。 ----------------------------------------------------------------------------------------------------------------- 我们在百度地图API的类参考里,找到这个一个类,setViewport 。
1169 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18898 0
【百度地图API】如何给自定义覆盖物添加事件
原文:【百度地图API】如何给自定义覆盖物添加事件 摘要:   给marker、lable、circle等Overlay添加事件很简单,直接addEventListener即可。那么,自定义覆盖物的事件应该如何添加呢?我们一起来看一看~ -----------------------------...
840 0
透过【百度地图API】分析双闭包问题
原文:透过【百度地图API】分析双闭包问题 摘要:   有位API爱好者问到,昨天的教程里为什么不使用for循环?他使用for循环后,也发现代码无效。这是什么原因? -----------------------------------------------------------------...
729 0
+关注
2968
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载