Android 百度地图 SDK 开发完整教程
目录
- 准备工作
- 1 注册成为百度地图开发者
- 2 创建应用并获取 AK (API Key)
- 3 下载 SDK
- 4 配置 Android Studio 项目
- 显示一张基础地图
- 1 添加地图依赖
- 2 在 AndroidManifest.xml 中声明权限和 Key
- 3 在布局文件中添加地图控件
- 4 在 Activity/Fragment 中初始化地图
- 核心功能实战
- 1 定位到我的位置 (蓝点)
- 2 添加一个标记点 (Marker)
- 3 绘制一条路线 (Overlay)
- 4 地图点击事件
- 常见问题与最佳实践
- 1 Key 错误或无效
- 2 地图不显示,一片灰色或空白
- 3 模拟器定位问题
- 4 关于混淆
- 总结与进阶
准备工作
在开始编码之前,必须完成以下准备工作。

1 注册成为百度地图开发者
- 访问 百度地图开放平台。
- 点击右上角的“登录/注册”,使用百度账号登录。
- 登录后,进入“控制台”。
2 创建应用并获取 AK (API Key)
AK (Application Key) 是你的应用调用百度地图服务的凭证。
- 在控制台左侧菜单栏,点击“应用管理” -> “我的应用”。
- 点击“创建应用”,选择“Android SDK”。
- 填写应用信息:
- 应用名称:给你的应用起个名字,如 "MyBaiduMapDemo"。
- 包名:非常重要! 填写你的 Android 项目的包名(在
app/build.gradle文件的applicationId中可以找到,com.example.myapplication),这个必须和最终打包 APK 的包名完全一致。 - 数字签名 (SHA1):这是用于验证应用身份的,你需要获取你的开发电脑或签名文件的 SHA1 值。
- 获取方法 (Android Studio):
- 打开 Android Studio,点击菜单
Build->Generate Signed Bundle / APK...。 - 选择 APK 或 App Bundle,点击 "Next"。
- 在 "Key store path" 区域,点击 "Choose existing..." 或 "Create new...",如果是创建新的,会要求你设置密钥库密码、密钥密码和密钥别名,记住这些信息!
- 填写完信息后,Android Studio 会在下方显示 "Certificate fingerprint",这里的 SHA1 值就是你要复制的。
- (推荐)使用命令行获取:如果你已经有
debug.keystore(Android Studio 默认的调试密钥),可以在终端运行:keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
复制其中的
SHA1值。
- 打开 Android Studio,点击菜单
- 获取方法 (Android Studio):
- 填写完包名和 SHA1 后,点击“提交”。
- 在应用列表中,你会看到刚刚创建的应用,其右侧的“AK”列就是你的 API Key。请妥善保管此 Key。
3 下载 SDK
- 在控制台左侧菜单,点击“开发文档” -> “Android SDK”。
- 在页面右侧找到“下载”按钮,进入下载页面。
- 根据你的需求选择要下载的功能包,通常下载 “基础地图包” 即可,它包含了核心地图功能,如果你需要定位、搜索、路线等功能,需要下载对应的扩展包。
- 下载后,你会得到一个
.zip压缩包,解压后找到BaiduMapSDK_Android_X.X.X.jar和libs文件夹(里面是.so库文件)。
4 配置 Android Studio 项目
- 新建项目:在 Android Studio 中创建一个新的 Empty Activity 项目。
- 复制 JAR 和 SO 文件:
- 将下载的
BaiduMapSDK_Android_X.X.X.jar复制到你的项目的app/libs目录下。 - 将下载的
libs文件夹(包含armeabi,armeabi-v7a,arm64-v8a,x86,x86_64等子文件夹)中的所有内容,复制到你项目的app/src/main/jniLibs目录下。jniLibs目录不存在,请手动创建。
- 将下载的
- 添加 JAR 依赖:
- 右键点击
app/libs目录下的.jar文件,选择 "Add As Library..."。 - 在弹出的窗口中,选择
app模块,点击 "OK"。 - 或者,在
app/build.gradle文件的dependencies代码块中手动添加:implementation files('libs/BaiduMapSDK_Android_X.X.X.jar')
- 右键点击
- 配置 build.gradle (Module: app):
确保你的
android代码块中包含了以下配置,以支持 C++ 和 Java 8。android { // ... defaultConfig { // ... ndk { // 设置支持的SO库架构 abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
显示一张基础地图
让我们在屏幕上显示地图。
1 添加地图依赖
我们已经添加了 JAR 包,但为了使用最新版本的 Kotlin 和 AndroidX,还需要添加一些额外的依赖,在 app/build.gradle 的 dependencies 中添加:

// 如果使用 Kotlin implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.8.10' // 如果使用 Java // implementation 'androidx.appcompat:appcompat:1.6.1' // 如果使用 Fragment implementation 'androidx.fragment:fragment-ktx:1.6.0'
2 在 AndroidManifest.xml 中声明权限和 Key
这是最关键的一步,缺少任何一项地图都无法显示。
打开 app/src/main/AndroidManifest.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 1. 声明必要的网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 2. 声明定位权限 (API 23以上需要动态申请) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 3. 声明硬件加速,提升地图渲染性能 -->
<application
android:usesCleartextTraffic="true"
android:hardwareAccelerated="true"
...>
<!-- 4. 在 application 标签内添加你的 AK -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="请在这里替换成你自己的AK" />
<!-- 5. 声明百度地图的 Service -->
<service
android:name="com.baidu.location.f.a"
android:enabled="true"
android:process=":remote" />
<activity ...>
...
</activity>
</application>
</manifest>
3 在布局文件中添加地图控件
打开 app/src/main/res/layout/activity_main.xml 文件,添加 MapView 控件。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
4 在 Activity/Fragment 中初始化地图
让我们在代码中启动地图。

打开 MainActivity.kt (或 .java) 文件:
Kotlin 版本:
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.baidu.mapapi.map.MapView
import com.baidu.mapapi.map.BaiduMap
import com.baidu.mapapi.model.LatLng
class MainActivity : AppCompatActivity() {
private lateinit var mapView: MapView
private lateinit var baiduMap: BaiduMap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 在 setContentView 之前初始化 SDK
SDKInitializer.initialize(applicationContext)
setContentView(R.layout.activity_main)
// 初始化地图
mapView = findViewById(R.id.bmapView)
baiduMap = mapView.map
// 设置地图的缩放级别
baiduMap.setMapStatusByMapStatus(
com.baidu.mapapi.map.MapStatus.Builder()
.zoom(15.0f)
.target(LatLng(39.915, 116.404)) // 设置中心点为天安门
.build()
)
}
// 必须重写这两个方法,用于管理地图的生命周期
override fun onResume() {
super.onResume()
mapView.onResume()
}
override fun onPause() {
super.onPause()
mapView.onPause()
}
override fun onDestroy() {
super.onDestroy()
mapView.onDestroy()
}
}
Java 版本:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.SDKInitializer;
public class MainActivity extends AppCompatActivity {
private MapView mapView;
private BaiduMap baiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在 setContentView 之前初始化 SDK
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
// 初始化地图
mapView = findViewById(R.id.bmapView);
baiduMap = mapView.getMap();
// 设置地图的缩放级别
baiduMap.setMapStatusByMapStatus(
new com.baidu.mapapi.map.MapStatus.Builder()
.zoom(15.0f)
.target(new LatLng(39.915, 116.404)) // 设置中心点为天安门
.build()
);
}
// 必须重写这两个方法,用于管理地图的生命周期
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
}
注意:在 onCreate 方法中,SDKInitializer.initialize(applicationContext) 必须在 setContentView 之前调用,否则会报错。
现在运行你的 App,你应该能看到一张以天安门为中心的地图了!
核心功能实战
1 定位到我的位置 (蓝点)
要实现定位,你需要下载并集成 百度定位 SDK。
- 下载定位 SDK:在百度地图开放平台下载定位 SDK,并将 JAR 和 SO 文件按 1.4 节所述的方法添加到项目中。
- 添加依赖:在
app/build.gradle中添加定位 SDK 的 JAR。implementation files('libs/BaiduLBS_Android.jar') // 定位 SDK 的 JAR - 实现定位逻辑:
// 在 MainActivity.kt 中添加
import com.baidu.location.BDLocation
import com.baidu.location.BDLocationListener
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
class MainActivity : AppCompatActivity() {
// ... 其他代码 ...
private lateinit var locationClient: LocationClient
private val locationListener = MyLocationListener()
inner class MyLocationListener : BDLocationListener {
override fun onReceiveLocation(location: BDLocation?) {
if (location == null || location district == null) {
return
}
// 获取经纬度
val latitude = location.latitude
val longitude = location.longitude
// 将地图中心移动到我的位置
val ll = LatLng(latitude, longitude)
val update = com.baidu.mapapi.map.MapStatusUpdateFactory.newLatLng(ll)
baiduMap.animateMapStatus(update)
// 可选:添加一个定位图标
val locationMarker = com.baidu.mapapi.map.MarkerOptions()
.position(ll)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_location_marker)) // 准备一个 marker 图标
baiduMap.addOverlay(locationMarker)
}
override fun onConnectHotSpotMessage(s: String, i: Int) {}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
SDKInitializer.initialize(applicationContext)
setContentView(R.layout.activity_main)
mapView = findViewById(R.id.bmapView)
baiduMap = mapView.map
// 初始化定位客户端
locationClient = LocationClient(applicationContext)
locationClient.registerLocationListener(locationListener)
// 配置定位参数
val option = LocationClientOption()
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy) // 高精度模式
option.setCoorType("bd09ll") // 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(1000) // 设置发起定位请求的间隔时间为1000ms
locationClient.locOption = option
// 启动定位
locationClient.start()
}
override fun onDestroy() {
super.onDestroy()
mapView.onDestroy()
// 停止定位
locationClient.stop()
}
}
注意:你需要在 res/drawable 目录下添加一个名为 ic_location_marker.png 的 marker 图标,或者使用 BitmapDescriptorFactory.fromResource(R.drawable.your_icon) 来指定。
2 添加一个标记点 (Marker)
// 在 onCreate 或其他方法中
val beijing = LatLng(39.90923, 116.397428) // 北京坐标
val markerOption = com.baidu.mapapi.map.MarkerOptions()
.position(beijing)"北京市")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)) // 设置蓝色默认图标
// 在地图上添加 Marker
baiduMap.addOverlay(markerOption)
3 绘制一条路线 (Overlay)
绘制路线需要使用 OverlayOptions,通常我们使用 PolylineOptions 来绘制折线。
import com.baidu.mapapi.map.PolylineOptions
import com.baidu.mapapi.map.DotOptions
// 在 onCreate 或其他方法中
val points = ArrayList<LatLng>()
points.add(LatLng(39.90923, 116.397428)) // 起点
points.add(LatLng(39.91923, 116.407428)) // 途经点
points.add(LatLng(39.92923, 116.417428)) // 终点
val polylineOption = PolylineOptions()
.width(10) // 线宽
.color(Color.argb(255, 0, 0, 255)) // 颜色
.points(points) // 设置点集合
// 在地图上绘制折线
baiduMap.addOverlay(polylineOption)
4 地图点击事件
// 在 onCreate 中设置
baiduMap.setOnMapClickListener { latLng ->
// latLng 就是点击位置的经纬度
Toast.makeText(this, "点击位置: ${latLng.latitude}, ${latLng.longitude}", Toast.LENGTH_SHORT).show()
// 在点击位置添加一个标记
val clickMarker = MarkerOptions()
.position(latLng)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_location_marker))
baiduMap.addOverlay(clickMarker)
}
常见问题与最佳实践
1 Key 错误或无效
- 问题:Logcat 中出现
BaiduMapSDK com.baidu.mapapi... SDKInitializer failed错误。 - 原因:
AndroidManifest.xml中填写的 AK 错误、过期,或者包名/SHA1 不匹配。 - 解决:仔细检查 AK、包名和 SHA1 是否与你在百度地图开放平台创建的应用完全一致。
2 地图不显示,一片灰色或空白
- 问题:App 运行正常,但地图区域是灰色或白色的。
- 原因:
- 网络权限未开启:App 没有网络连接,无法加载地图瓦片。
- 硬件加速被禁用:
AndroidManifest.xml中application标签的android:hardwareAccelerated="false"。 - Key 问题:同上。
- 解决:
- 检查手机是否联网。
- 确保
application标签中有android:hardwareAccelerated="true"。 - 再次检查 Key 配置。
3 模拟器定位问题
- 问题:在模拟器上无法获取定位,或定位不准。
- 原因:模拟器没有真实的 GPS 硬件。
- 解决:
- 使用模拟器位置模拟器:在 Android Studio 的模拟器工具栏中,有一个 "更多" (⋮) -> "模拟位置控制台" (Location emulator),可以手动设置一个经纬度。
- 使用 GPX/KML 文件:同样在 "模拟位置控制台" 中,可以加载一个 GPX 或 KML 文件来模拟一段轨迹。
- 使用真实设备测试:定位功能最终必须在真机上测试。
4 关于混淆
在发布正式版 APK 时,需要在 proguard-rules.pro 文件中添加百度地图 SDK 的混淆规则,防止代码被混淆后导致功能异常。
在 proguard-rules.pro 中添加:
# BaiduMap SDK
-keep class com.baidu.mapapi.** {*;}
-dontwarn com.baidu.mapapi.**
-keep class com.baidu.location.** {*;}
-dontwarn com.baidu.location.**
-keep class com.baidu.location.f.** {*;}
-dontwarn com.baidu.location.f.**
总结与进阶
恭喜!你已经成功集成了百度地图 SDK,并掌握了显示地图、定位、添加标记和绘制路线等核心功能。
进阶学习方向:
- 地图样式:学习如何自定义地图的底图样式(如标准、卫星、三维等)。
- 搜索功能:集成百度地图的 搜索 SDK,实现 POI(兴趣点)搜索、地理编码(地址转坐标)、反地理编码(坐标转地址)等功能。
- 路线规划:集成 路线规划 SDK,实现驾车、公交、步行等路线规划,并在地图上绘制。
- 离线地图:学习如何下载和使用离线地图包,以在没有网络的情况下也能使用地图。
- 覆盖物动画:为 Marker 或 Polyline 添加动画效果,使地图更生动。
希望这份教程能帮助你顺利入门 Android 百度地图开发!如果遇到问题,请多查阅 百度地图官方开发文档,那里有最权威和最新的信息。
