码迷,mamicode.com
首页 > 移动开发 > 详细

Android 百度地图API 定位 导航

时间:2014-11-20 09:07:11      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:android应用


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

         bubuko.com,布布扣                        bubuko.com,布布扣

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

       bubuko.com,布布扣

 

接下来就看如何实现了,首先,注册百度开发者账号,并进入百度地图API查看相关资料百度地图API,然后就是为需要加入地图的应用注册APP KEY,注册完后,下载百度地图jar文件,新建工程,并导入即可,下面看实现具体代码,在代码中有详细注释:

?
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 百度地图API 定位 导航

标签:android应用

原文地址:http://blog.csdn.net/littleyearyear/article/details/41307417

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!