在Android开发中有一个非常重要的应用就是实时定位,通过手机在手机地图上进行实时定位,定位当前手机的位置,这个功能我们一般都可以用百度地图或者谷歌地图的api来实现,这些api代码要在百度或者谷歌的官网上下载,这里不再多说,本文以代码实例的方式展示如何使用百度地图的api,安卓开发者可以直接复制本文示例代码到项目中进行测试,本文仅仅是使用百度地图api的核心代码,如果要使用可能需要进行相关修改,具体参考代码请参看下文:
1.先来看看java代码,MainActivity.class参考代码如下:
1
public
class MainActivity
extends MapActivity {
2 // 初始位置设置为西安
3 private double userLongitude = 34 .341568 * 1E6; // 纬度
4 private double userLatitude = 108 .94017499999995 * 1E6; // 经度
5 // 添加百度相关控件
6 private MapView mapView;
7 private BMapManager bMapManager; // 加载地图的引擎
8 // 百度地图上的key值
9 private String keyString = "01331AFA954E7E300428A5F0C9C829E0E16F87A3";
10 // 在百度地图上添加一些控件,例如放大、缩小
11 private MapController mapController;
12 private MKLocationManager mLocationManager;
13
14 @Override
15 public void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.activity_main);
18 // 实例化控件
19 mapView = (MapView) this.findViewById(R.id.bmapView);
20 bMapManager = new BMapManager(MainActivity. this);
21 // 必须要加载key
22 bMapManager.init(keyString, new MKGeneralListener() {
23 // key值不正确
24 @Override
25 public void onGetPermissionState( int arg0) {
26 if (arg0 == 300) {
27 Toast.makeText(MainActivity. this, R.string.key_error,Toast.LENGTH_LONG).show();
28 }
29 }
30 //网络出错
31 @Override
32 public void onGetNetworkState( int arg0) {
33 Toast.makeText(MainActivity. this, R.string.net_error,Toast.LENGTH_LONG).show();
34 }
35 });
36 this.initMapActivity(bMapManager);
37 mapView.setBuiltInZoomControls( true); // 表示可以设置缩放功能
38 mapController = mapView.getController();
39 // 初始化Location模块
40 mLocationManager = bMapManager.getLocationManager();
41 // 通过enableProvider和disableProvider方法,选择定位的Provider
42 mLocationManager.enableProvider(MKLocationManager.MK_NETWORK_PROVIDER);
43 mLocationManager.disableProvider(MKLocationManager.MK_GPS_PROVIDER);
44 //返回手机位置
45 mLocationManager.requestLocationUpdates(locationListener);
46 mLocationManager.setNotifyInternal( 5, 2);
47 // 添加定位图层
48 MyLocationOverlay myLocationOverlay = new MyLocationOverlay( this,mapView);
49 myLocationOverlay.enableMyLocation(); // 启用定位
50 myLocationOverlay.enableCompass(); // 启用指南针
51 mapView.getOverlays().add(myLocationOverlay);
52 mapView.setTraffic( true); // 交通地图
53 // mapView.setSatellite(true);// 卫星地图
54 mapController.setZoom( 15); // 设置缩放级别
55 mapView.invalidate(); // 刷新地图
56 }
57 //获取经度纬度
58 private LocationListener locationListener = new LocationListener() {
59 @Override
60 public void onLocationChanged(Location location) {
61 if (location != null) {
62 userLatitude = location.getLatitude() * 1E6;
63 userLongitude = location.getLongitude() * 1E6;
64 GeoPoint mypoint = new GeoPoint(( int)(userLatitude), ( int)(userLongitude));
65 mapView.getController().animateTo(mypoint);
66 }
67 }
68 };
69 // 销毁
70 @Override
71 protected void onDestroy() {
72 super.onDestroy();
73 if (bMapManager != null) {
74 bMapManager.destroy();
75 bMapManager = null;
76 }
77 }
78 // 停止
79 @Override
80 protected void onPause() {
81 super.onPause();
82 if (bMapManager != null) {
83 mLocationManager.removeUpdates(locationListener);
84 bMapManager.stop();
85 }
86 }
87 // 重启
88 @Override
89 protected void onResume() {
90 super.onResume();
91 if (bMapManager != null) {
92 bMapManager.start();
93 }
94 }
95 //
96 @Override
97 protected boolean isRouteDisplayed() {
98 return false;
99 }
100
101
102 // Menu
103 // 当点击Menu按钮时,调用该方法
104 @Override
105 public boolean onCreateOptionsMenu(Menu menu) {
106 menu.add( 0, 1, 1, R.string.exit).setIcon(
107 android.R.drawable.ic_menu_close_clear_cancel);
108 return super.onCreateOptionsMenu(menu);
109 }
110 @Override
111 public boolean onContextItemSelected(MenuItem item) { // 选中某个菜单项
112 if (item.getItemId() == 1) {
113 MainActivity. this.finish();
114 }
115 return super.onOptionsItemSelected(item);
116 }
117 // 返回键
118 @Override
119 public boolean onKeyDown( int keyCode, KeyEvent event) {
120 if (keyCode == KeyEvent.KEYCODE_BACK) {
121 finish();
122 }
123 return super.onKeyDown(keyCode, event);
124 }
125 }
126
2 // 初始位置设置为西安
3 private double userLongitude = 34 .341568 * 1E6; // 纬度
4 private double userLatitude = 108 .94017499999995 * 1E6; // 经度
5 // 添加百度相关控件
6 private MapView mapView;
7 private BMapManager bMapManager; // 加载地图的引擎
8 // 百度地图上的key值
9 private String keyString = "01331AFA954E7E300428A5F0C9C829E0E16F87A3";
10 // 在百度地图上添加一些控件,例如放大、缩小
11 private MapController mapController;
12 private MKLocationManager mLocationManager;
13
14 @Override
15 public void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.activity_main);
18 // 实例化控件
19 mapView = (MapView) this.findViewById(R.id.bmapView);
20 bMapManager = new BMapManager(MainActivity. this);
21 // 必须要加载key
22 bMapManager.init(keyString, new MKGeneralListener() {
23 // key值不正确
24 @Override
25 public void onGetPermissionState( int arg0) {
26 if (arg0 == 300) {
27 Toast.makeText(MainActivity. this, R.string.key_error,Toast.LENGTH_LONG).show();
28 }
29 }
30 //网络出错
31 @Override
32 public void onGetNetworkState( int arg0) {
33 Toast.makeText(MainActivity. this, R.string.net_error,Toast.LENGTH_LONG).show();
34 }
35 });
36 this.initMapActivity(bMapManager);
37 mapView.setBuiltInZoomControls( true); // 表示可以设置缩放功能
38 mapController = mapView.getController();
39 // 初始化Location模块
40 mLocationManager = bMapManager.getLocationManager();
41 // 通过enableProvider和disableProvider方法,选择定位的Provider
42 mLocationManager.enableProvider(MKLocationManager.MK_NETWORK_PROVIDER);
43 mLocationManager.disableProvider(MKLocationManager.MK_GPS_PROVIDER);
44 //返回手机位置
45 mLocationManager.requestLocationUpdates(locationListener);
46 mLocationManager.setNotifyInternal( 5, 2);
47 // 添加定位图层
48 MyLocationOverlay myLocationOverlay = new MyLocationOverlay( this,mapView);
49 myLocationOverlay.enableMyLocation(); // 启用定位
50 myLocationOverlay.enableCompass(); // 启用指南针
51 mapView.getOverlays().add(myLocationOverlay);
52 mapView.setTraffic( true); // 交通地图
53 // mapView.setSatellite(true);// 卫星地图
54 mapController.setZoom( 15); // 设置缩放级别
55 mapView.invalidate(); // 刷新地图
56 }
57 //获取经度纬度
58 private LocationListener locationListener = new LocationListener() {
59 @Override
60 public void onLocationChanged(Location location) {
61 if (location != null) {
62 userLatitude = location.getLatitude() * 1E6;
63 userLongitude = location.getLongitude() * 1E6;
64 GeoPoint mypoint = new GeoPoint(( int)(userLatitude), ( int)(userLongitude));
65 mapView.getController().animateTo(mypoint);
66 }
67 }
68 };
69 // 销毁
70 @Override
71 protected void onDestroy() {
72 super.onDestroy();
73 if (bMapManager != null) {
74 bMapManager.destroy();
75 bMapManager = null;
76 }
77 }
78 // 停止
79 @Override
80 protected void onPause() {
81 super.onPause();
82 if (bMapManager != null) {
83 mLocationManager.removeUpdates(locationListener);
84 bMapManager.stop();
85 }
86 }
87 // 重启
88 @Override
89 protected void onResume() {
90 super.onResume();
91 if (bMapManager != null) {
92 bMapManager.start();
93 }
94 }
95 //
96 @Override
97 protected boolean isRouteDisplayed() {
98 return false;
99 }
100
101
102 // Menu
103 // 当点击Menu按钮时,调用该方法
104 @Override
105 public boolean onCreateOptionsMenu(Menu menu) {
106 menu.add( 0, 1, 1, R.string.exit).setIcon(
107 android.R.drawable.ic_menu_close_clear_cancel);
108 return super.onCreateOptionsMenu(menu);
109 }
110 @Override
111 public boolean onContextItemSelected(MenuItem item) { // 选中某个菜单项
112 if (item.getItemId() == 1) {
113 MainActivity. this.finish();
114 }
115 return super.onOptionsItemSelected(item);
116 }
117 // 返回键
118 @Override
119 public boolean onKeyDown( int keyCode, KeyEvent event) {
120 if (keyCode == KeyEvent.KEYCODE_BACK) {
121 finish();
122 }
123 return super.onKeyDown(keyCode, event);
124 }
125 }
126
2.布局文件,主要是添加显示地图的控件,activity_mainmain.xml参考代码如下:
1
<
LinearLayout
xmlns:android="
http://schemas.android.com/apk/res/android"
2 xmlns:tools=" http://schemas.android.com/tools"
3 android:layout_width=" match_parent"
4 android:layout_height=" match_parent" >
5 <!-- 添加显示百度地图的控件 -- >
6 < com.baidu.mapapi.MapView
7 android:id=" @+id/bmapView"
8 android:layout_width=" fill_parent"
9 android:layout_height=" fill_parent"
10 android:clickable=" true"
11 tools:context=" .MainActivity" / >
12 </ LinearLayout >
2 xmlns:tools=" http://schemas.android.com/tools"
3 android:layout_width=" match_parent"
4 android:layout_height=" match_parent" >
5 <!-- 添加显示百度地图的控件 -- >
6 < com.baidu.mapapi.MapView
7 android:id=" @+id/bmapView"
8 android:layout_width=" fill_parent"
9 android:layout_height=" fill_parent"
10 android:clickable=" true"
11 tools:context=" .MainActivity" / >
12 </ LinearLayout >
3.设置配置文件,AndroidManifest.xml参考代码如下:
1
<
manifest
xmlns:android="
http://schemas.android.com/apk/res/android"
2 package=" yu.hong.map"
3 android:versionCode=" 1"
4 android:versionName=" 1.0" >
5 < uses-sdk android:minSdkVersion=" 10" android:targetSdkVersion=" 15" / >
6 <!--添加百度地图开发授权 -- >
7 < uses-permission android:name=" android.permission.ACCESS_NETWORK_STATE" / >
8 < uses-permission android:name=" android.permission.WRITE_EXTERNAL_STORAGE" / >
9 < uses-permission android:name=" android.permission.ACCESS_WIFI_STATE" / >
10 < uses-permission android:name=" android.permission.CHANGE_WIFI_STATE" / >
11 < uses-permission android:name=" android.permission.ACCESS_FINE_LOCATION" / >
12 < uses-permission android:name=" android.permission.INTERNET" / >
13 < uses-permission android:name=" android.permission.READ_PHONE_STATE" / >
14 <!--添加对屏幕的支持 -- >
15 < supports-screens
16 android:anyDensity=" true"
17 android:largeScreens=" true"
18 android:normalScreens=" true"
19 android:resizeable=" true"
20 android:smallScreens=" true" / >
21 < application
22 android:icon=" @drawable/ic_maplauncher"
23 android:label=" @string/app_name"
24 android:theme=" @style/AppTheme" >
25 < activity
26 android:name=" .MainActivity"
27 android:label=" @string/title_activity_main" >
28 < intent-filter >
29 < action android:name=" android.intent.action.MAIN" / >
30 < category android:name=" android.intent.category.LAUNCHER" / >
31 </ intent-filter >
32 </ activity >
33 </ application >
34 </ manifest >
2 package=" yu.hong.map"
3 android:versionCode=" 1"
4 android:versionName=" 1.0" >
5 < uses-sdk android:minSdkVersion=" 10" android:targetSdkVersion=" 15" / >
6 <!--添加百度地图开发授权 -- >
7 < uses-permission android:name=" android.permission.ACCESS_NETWORK_STATE" / >
8 < uses-permission android:name=" android.permission.WRITE_EXTERNAL_STORAGE" / >
9 < uses-permission android:name=" android.permission.ACCESS_WIFI_STATE" / >
10 < uses-permission android:name=" android.permission.CHANGE_WIFI_STATE" / >
11 < uses-permission android:name=" android.permission.ACCESS_FINE_LOCATION" / >
12 < uses-permission android:name=" android.permission.INTERNET" / >
13 < uses-permission android:name=" android.permission.READ_PHONE_STATE" / >
14 <!--添加对屏幕的支持 -- >
15 < supports-screens
16 android:anyDensity=" true"
17 android:largeScreens=" true"
18 android:normalScreens=" true"
19 android:resizeable=" true"
20 android:smallScreens=" true" / >
21 < application
22 android:icon=" @drawable/ic_maplauncher"
23 android:label=" @string/app_name"
24 android:theme=" @style/AppTheme" >
25 < activity
26 android:name=" .MainActivity"
27 android:label=" @string/title_activity_main" >
28 < intent-filter >
29 < action android:name=" android.intent.action.MAIN" / >
30 < category android:name=" android.intent.category.LAUNCHER" / >
31 </ intent-filter >
32 </ activity >
33 </ application >
34 </ manifest >