现在许多APP应用都需要实现地图功能,能够很好的对自己所在的位置进行定位。因此,我尝试着使用下百度地图实现将自己的位置显示出来。
这里我使用百度为我们提供的“百度地图”。
登录百度账号,并打开http://developer.baidu.com/user/reg这个网址,填写注册信息,创建应用,并申请API Key
成功注册后,登录到百度开发者中心。点击页面由上角的LBS(基于位置服务)超链接,选择"开发"——>API控制台——>创建应用。
应用详情选择AndroidSDK,启动默认服务即可。发布版SHA1或者开发版SHA1式我们打包程序时所用的keystore的SHA1指纹,可以在eclipse中查看到。点击eclipse导航栏的window——>Preferences——>Android——>Build,界面如下:
填写完后,即可将应用创建完成。
其中,MGpSDi21hlltOmLk74cuDZmgnSCF9cCt就是申请到的API Key,有了它就可以进行后续的地图开发了。
通过,http://developer.baidu.com/map/sdkandev-download.htm下载开发百度地图的SDK 。一键下载:里面有开发包,开发示例,类参考等资料下载可以学习使用。
这是我们下载好的开发包:
将我们下载好的百度开发包导入到我们项目的对应目录中去。
到这里,我们已经顺利的将百度地图的SDK整合到我们的项目中去了。下来,我们要学习使用百度SDK,让自己的应用中也有地图导航的效果。
代码实现:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.baidu.mapapi.map.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"/> </LinearLayout>MainActivity.java
package com.example.baidumaptest; import android.app.Activity; import android.os.Bundle; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.MapView; public class MainActivity extends Activity { private MapView mapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); } @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } /**失去焦点*/ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /**获取焦点*/ @Override protected void onResume() { super.onResume(); mapView.onResume(); } }在AndroidManifest.xml中添加使用百度地图的权限,我们这里先将所有权限加进去,方便后续开发。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />最后一步特别重要,将申请的百度API Key配置到AndroidManifest.xml中去。
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="MGpSDi21hlltOmLk74cuDZmgnSCF9cCt"/> <activity android:name="com.example.baidumaptest.MainActivity" 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>其中,com.baidu.lbsapi.API_KEY这个值是固定的,而MGpSDi21hlltOmLk74cuDZmgnSCF9cCt这个值就是我们申请的API Key了。
MainActivity.java
package com.example.baidumaptest; import java.util.List; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.Toast; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.model.LatLng; public class MainActivity extends Activity { private MapView mapView; private BaiduMap baiduMap; private LocationManager locationManager; private String provider; //这个变量的作用:是为了防止多次调用animateMapStatus()方法, //因为将地图移动到我们当前的位置只需要在程序第一次定位的时候调用一次就可以了。 private boolean isFirstLocate = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); //1.BaiduMap类,它是地图的总控制器,调用MapView的getMap()方法就能获取到BaiduMap的实例。 baiduMap = mapView.getMap(); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //2.获取所有可用的位置提供器 List<String> providerList = locationManager.getProviders(true); if(providerList.contains(LocationManager.GPS_PROVIDER)){ provider = LocationManager.GPS_PROVIDER; }else if(providerList.contains(LocationManager.NETWORK_PROVIDER)){ provider = LocationManager.NETWORK_PROVIDER; }else{ //当没有可用的位置提供器时,弹出Toast提示用户 Toast.makeText(this, "No location provider to use", 0).show(); return; } //3.根据位置提供器获取Location对象 Location location = locationManager.getLastKnownLocation(provider); if(location!=null){ //根据位置去在地图上导航定位 navigateTo(location); } locationManager.requestLocationUpdates(provider, 5000, 1, locationListener); } private void navigateTo(Location location) { if(isFirstLocate){ /** * 先将Location对象中的地理位置信息取出并封装到LatLng对象中,然后调用MapStatusUpdateFactory的newLatLng()方法 * 并将LatLng对象传入,接着将返回MapStatusUpdate对象作为参数传入到BaiduMap的animateMapStatus()方法当中。 */ LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update = MapStatusUpdateFactory.zoomTo(16f); baiduMap.animateMapStatus(update); isFirstLocate = false; } } LocationListener locationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onLocationChanged(Location location) { // 更新当前设备的位置信息 if(location!=null){ navigateTo(location); } } }; @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); if(locationManager!=null){ //关闭程序时将监听器移除 locationManager.removeUpdates(locationListener); } } /**失去焦点*/ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /**获取焦点*/ @Override protected void onResume() { super.onResume(); mapView.onResume(); } }运行效果:
package com.example.baidumaptest; import java.util.List; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.Toast; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; public class MainActivity extends Activity { private MapView mapView; private BaiduMap baiduMap; private LocationManager locationManager; private String provider; //这个变量的作用:是为了防止多次调用animateMapStatus()方法, //因为将地图移动到我们当前的位置只需要在程序第一次定位的时候调用一次就可以了。 private boolean isFirstLocate = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); //1.BaiduMap类,它是地图的总控制器,调用MapView的getMap()方法就能获取到BaiduMap的实例。 baiduMap = mapView.getMap(); baiduMap.setMyLocationEnabled(true); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //2.获取所有可用的位置提供器 List<String> providerList = locationManager.getProviders(true); if(providerList.contains(LocationManager.GPS_PROVIDER)){ provider = LocationManager.GPS_PROVIDER; }else if(providerList.contains(LocationManager.NETWORK_PROVIDER)){ provider = LocationManager.NETWORK_PROVIDER; }else{ //当没有可用的位置提供器时,弹出Toast提示用户 Toast.makeText(this, "No location provider to use", 0).show(); return; } //3.根据位置提供器获取Location对象 Location location = locationManager.getLastKnownLocation(provider); if(location!=null){ //根据位置去在地图上导航定位 navigateTo(location); } locationManager.requestLocationUpdates(provider, 5000, 1, locationListener); } private void navigateTo(Location location) { if(isFirstLocate){ /** * 先将Location对象中的地理位置信息取出并封装到LatLng对象中,然后调用MapStatusUpdateFactory的newLatLng()方法 * 并将LatLng对象传入,接着将返回MapStatusUpdate对象作为参数传入到BaiduMap的animateMapStatus()方法当中。 */ LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update = MapStatusUpdateFactory.zoomTo(16f); baiduMap.animateMapStatus(update); isFirstLocate = false; } /** * 注意这段逻辑必须写在isFirstLocate这个if条件语句的外面,因为让地图移动到我们 * 当前的位置只需要在第一次定位的时候执行,但是设备在地图上显示的位置却应该是随便设备移动而实时改变的。 */ MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData = locationBuilder.build(); baiduMap.setMyLocationData(locationData); } LocationListener locationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onLocationChanged(Location location) { // 更新当前设备的位置信息 if(location!=null){ navigateTo(location); } } }; @Override protected void onDestroy() { super.onDestroy(); baiduMap.setMyLocationEnabled(false); mapView.onDestroy(); if(locationManager!=null){ //关闭程序时将监听器移除 locationManager.removeUpdates(locationListener); } } /**失去焦点*/ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /**获取焦点*/ @Override protected void onResume() { super.onResume(); mapView.onResume(); } }另外,根据百度地图的限制,如果我们想要使用这一功能,一定要事先调用BaiduMap的setMyLocationEnabled()方法将此功能开启,否则的话设备的位置将无法在地图上显示。而在程序退出的时候,也要记得将此功能给关闭掉。
原文:http://blog.csdn.net/btt2013/article/details/51242965