您的位置:首页 > 移动开发 > Android开发

Android中实现百度地图

2016-04-26 18:04 429 查看
现在许多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();
}
}
运行效果:



让"我"显示在地图上,并跟着我移动

百度地图的API当中提供了一个MyLocationData.Builder类,这个类是用来封装设备当前所在位置的,我们只需要将经纬度信息传入到这个类的相应方法当中就可以了。
MyLocationData.Builder类还提供了一个build()方法,当我们把要封装的信息都设置完成之后只需要调用它的build()方法,就会生成一个MyLocationData的实例,然后再将这个实例传入到BaiduMap的setMyLocationData()方法当中就可以让设备当前的位置显示在地图上。写法如下:
MyLocationData locationData = locationBuilder.build();

baiduMap.setMyLocationData(locationData);

代码实现:
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.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()方法将此功能开启,否则的话设备的位置将无法在地图上显示。而在程序退出的时候,也要记得将此功能给关闭掉。

运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: