前言:
新手上路,这几天在弄百度地图SDK的使用(吐槽 : 官网上的开发指南简直就是实力坑爹,可能是开发人员太忙,维护不及时吧),我对本次学习的要求也不高:能正常显示地图,能定位,能添加mark(覆盖物),点击mark时能提示当前位置信息就行,再深的东西,以后有时间再去研究吧,毕竟新手还是欠火候。
因为软件开发更新换代太快,各位看官看的时候可能本文内容就已经过时了,所以先交代一下开发环境:
应用开发开发工具:
Android Studio 1.5.1
百度地图版本信息:
Android 地图 SDK v3.7.1
Android 定位 SDK v6.2.2
正文:
一、效果图
废话多说,先来一发截图,一眼就能看出来到底实现了哪些功能:
图1-1.实现定位
图1-2.拖拽到新的位置
如上面两幅图所示,图1-1显示的是当程序正常运行后,就会定位到当前位置,显示位置信息(’气泡’),图1-2显示的是当拖动mark到新的位置后,显示当前的位置信息,大家可能注意到图1-2右下角红色圆圈圈住的图标,是可以点击的,作用是实现重新定位。
二、开发过程
2.1导入库文件
去百度开发者中心下载最新的开发包,现在是支持按功能需求来下载开发包,我就贪婪的全都下载了(下载地址),最好的学习方式就是下载示例代码,模仿着写。解压下载好的库文件。
首先:在工程app/libs目录下放入BaiduLBS_Android.jar包,如图2-1所示。
然后:在src/main/目录下新建jniLibs目录,在jniLibs新建armeabi文件(这个文件要根据你的手机的cpu类型来创建,armeabi就是针对普通的或旧的arm cpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu),然后把动态链接库.so文件拷贝到该目录下,如图2-2所示。
最后:对于每个jar文件,右键-选择Add As Library,导入到工程中。
图2-1.导入jar包文件
图2-2.导入.so库文件
环境配置也可以参考官方指南.
2.2布局文件
修改activity_main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.yu.baidumapdemo.MainActivity">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="百 度 地 图" />
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/title"
android:clickable="true"/>
<Button
android:id="@+id/request_location"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginBottom="5dp"
android:layout_marginLeft="50dp"
android:background="@drawable/custom_loc"/>
</RelativeLayout>
布局文件如上所述,很简单,一个TextView显示一个标题(之后我用它来显示当前位置),一个com.baidu.mapapi.map.MapView,这是最重要的用来,是显示地图的控件,最后放了一个Button,就是图1-2中红圈所示的按钮,用来重新获取定位。
2.3java类代码
2.3.1初始化SDK
新建类 BaiduMapDemoApplication继承自Application
package com.yu.baidumapdemo;
import android.app.Application;
import com.baidu.mapapi.SDKInitializer;
/**
* Created by yu on 2016-03-09.
*/
public class BaiduMapDemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
//这样就不用每个Activity都初始化一遍了
SDKInitializer.initialize(this);
}
}
这个类的功能很简单,因为在使用百度地图的所有功能前都需要调用SDKInitializer.initialize(android.content.Context);来初始化组件,所以新建这个类继承自Application,并在AndroidManifest.xml文件进行配置(为application添加属性 android:name=“.BaiduMapDemoApplication”),保证最先得到初始化。
2.3.2实现地图定位等功能
MainActivity.java:
package com.yu.baidumapdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;