目录
- 准备工作
- 1 申请百度地图开放平台 AK (密钥)
- 2 下载百度地图 Android SDK
- 3 配置 Android Studio 项目
- 第一个地图:显示一个简单的地图
- 1 添加布局文件
- 2 初始化地图
- 3 运行第一个应用
- 核心功能详解
- 1 定位 (我的位置)
- 2 添加标记
- 3 绘制折线/路线
- 4 地图图层 (卫星图、实时路况等)
- 完整项目示例代码
- 1
AndroidManifest.xml配置 - 2
activity_main.xml布局 - 3
MainActivity.java逻辑
- 1
- 常见问题与注意事项
- 1 Key 校验失败
- 2 地图不显示,一片灰色
- 3 网络权限问题
- 4 混淆配置
- 进阶学习资源
准备工作
在开始编码之前,必须完成以下三步准备工作。

1 申请百度地图开放平台 AK (密钥)
AK (Access Key) 是你应用使用百度地图服务的凭证。
- 注册账号:访问 百度地图开放平台,使用百度账号登录。
- 创建应用:
- 登录后,进入 “控制台” -> “应用管理” -> “我的应用” -> “创建应用”。
- 选择应用类型,对于 Android 开发,选择
Android SDK。 - 填写应用信息:
- 应用名称:给你的应用起个名字,如 "MyBaiduMapDemo"。
- 包名:非常重要! 填写你的 Android 项目的包名(在
app/build.gradle文件的applicationId中可以找到,com.example.myapplication)。 - SHA1:非常重要! 这是你的应用签名文件的哈希值,用于验证你的应用身份。
- 如何获取 SHA1:
- 在 Android Studio 中,打开你的项目。
- 点击菜单栏的
Build->Generate Signed Bundle / APK...。 - 选择
APK,点击Next。 - 如果没有签名,点击
Create new...创建一个新的,如果已有,选择它。 - 在弹出的窗口中,找到
Certificate部分,复制SHA-1后面的值。 - 注意:如果你使用的是 Android Studio 的默认调试签名,可以在
Terminal(终端) 中运行以下命令获取:keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
复制
SHA-1的值。
- 如何获取 SHA1:
- 发布版 SHA1:如果需要发布到应用市场,你需要为你的正式签名文件再申请一个 SHA1,在开发阶段,可以先不填。
- 获取 AK:创建成功后,在应用列表中找到你创建的应用,即可看到
AK。请务必复制并保存好这个 AK。
2 下载百度地图 Android SDK
- 访问 百度地图 Android SDK 下载页面。
- 选择你需要的 SDK 版本和功能模块,对于初学者,选择“基础地图”即可。
- 下载后,你会得到一个
.zip压缩包,解压后,主要关注BaiduMapSDK_android_xxx.jar(核心库) 和libs文件夹 (so 文件)。
3 配置 Android Studio 项目
- 新建项目:在 Android Studio 中创建一个新的 Empty Activity 项目。
- 复制 SDK 文件:
- 将解压后的
BaiduMapSDK_android_xxx.jar复制到你的项目的app/libs目录下。 - 将解压后的
libs目录下的所有.so文件,复制到你项目的app/src/main/jniLibs目录下。jniLibs目录不存在,请手动创建。
- 将解压后的
- 添加依赖:
- 打开
app/build.gradle文件。 - 在
dependencies代码块中,添加对本地 JAR 包的引用:dependencies { // ... 其他依赖 implementation files('libs/BaiduMapSDK_android_xxx.jar') // xxx替换成你的jar包版本号 } - 确保你的
android代码块中包含了sourceSets配置,以包含jniLibs目录:android { // ... sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } }
- 打开
- 添加网络权限:
- 打开
app/src/main/AndroidManifest.xml文件。 - 在
<manifest>标签内添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 打开
第一个地图:显示一个简单的地图
我们来让地图在屏幕上显示出来。
1 添加布局文件
打开 app/src/main/res/layout/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"
tools:context=".MainActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</RelativeLayout>
核心是 com.baidu.mapapi.map.MapView,这是百度地图 SDK 提供的地图视图组件。
2 初始化地图
打开 app/src/main/java/com/yourpackage/MainActivity.java (将 com.yourpackage 替换成你自己的包名),修改代码如下:
package com.example.myapplication; // 替换成你的包名
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MapActivity;
public class MainActivity extends AppCompatActivity {
private MapView mMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前务必先配置,keys请替换为你的合法key
// 注意:此处的 AK 需要在 AndroidManifest.xml 中配置,也可以在这里直接传入
// SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
// 获取地图控件引用
mMapView = findViewById(R.id.bmapView);
}
@Override
protected void onResume() {
super.onResume();
// 在 activity 执行 onResume 时执行 mMapView.onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
// 在 activity 执行 onPause 时执行 mMapView.onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在 activity 执行 onDestroy 时执行 mMapView.onDestroy (),实现地图生命周期管理
mMapView.onDestroy();
}
}
3 运行第一个应用
你需要在 AndroidManifest.xml 中配置你申请的 AK。
- 打开
app/src/main/AndroidManifest.xml。 - 在
<application>标签内部,<activity>标签之前,添加<meta-data>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication"> <!-- 替换成你的包名 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 添加百度地图 AK -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="在这里填入你的AK" />
</application>
</manifest>
连接真机或启动模拟器,运行你的 App,如果一切顺利,你应该能看到一个可以缩放、拖动的中国地图了!

核心功能详解
1 定位 (我的位置)
定位需要额外的 Location SDK。
- 下载并配置 Location SDK:重复 1.2 和 1.3 步骤,下载 Location SDK,并将 JAR 和 SO 文件添加到你的项目中。
- 添加定位权限:在
AndroidManifest.xml中添加:<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- 实现定位逻辑:
// 在 MainActivity.java 中添加
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.model.LatLng;
// ... 在 MainActivity 类中添加成员变量
private BaiduMap mBaiduMap;
private LocationClient mLocationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化 SDK
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mMapView = findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 定�始化定位
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开GPS
option.setCoorType("bd09ll"); // 设置坐标类型
mLocationClient.setLocOption(option);
mLocationClient.start();
}
// 自定义定位监听器
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || mMapView == null) {
return;
}
// 获取经纬度
double latitude = location.getLatitude();
double longitude = location.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
// 构建地图状态,将地图中心移动到定位点
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.setMapStatus(msu);
// 可选:设置缩放级别
MapStatusUpdate msuZoom = MapStatusUpdateFactory.zoomTo(16f);
mBaiduMap.animateMapStatus(msuZoom);
}
@Override
public void onConnectHotSpotMessage(String s, int i) {}
}
2 添加标记
// 在定位成功后或需要添加标记的地方调用 import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.model.BitmapDescriptor; import com.baidu.mapapi.model.BitmapDescriptorFactory; // ... // 创建一个 LatLng 对象 LatLng point = new LatLng(39.963175, 116.400244); // 天安门 // 创建 BitmapDescriptor,使用默认的图标 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_location_marker); // 需要自己准备一个 marker 图片 // 创建 MarkerOption MarkerOptions option = new MarkerOptions(); option.position(point); option.icon(bitmap); // 设置图标 // 在地图上添加 Marker mBaiduMap.addOverlay(option);
3 绘制折线/路线
// 在需要绘制路线的地方调用 import com.baidu.mapapi.map.PolylineOptions; import com.baidu.mapapi.model.LatLng; import java.util.ArrayList; import java.util.List; // ... // 创建一个点列表 List<LatLng> points = new ArrayList<>(); points.add(new LatLng(39.963175, 116.400244)); // 起点 points.add(new LatLng(39.910, 116.407)); // 途经点 points.add(new LatLng(39.920, 116.410)); // 终点 // 创建 PolylineOption PolylineOptions polylineOption = new PolylineOptions(); polylineOption.points(points); polylineOption.width(10); // 设置线宽 polylineOption.color(Color.argb(255, 255, 0, 0)); // 设置颜色 (红色) // 在地图上绘制折线 mBaiduMap.addOverlay(polylineOption);
4 地图图层
// 切换地图类型 // MAP_NORMAL: 普通地图 // MAP_SATELLITE: 卫星图 // MAP_TERRAIN: 地形图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // 开启/关闭实时路况 mBaiduMap.setTrafficEnabled(true); // 开启 // mBaiduMap.setTrafficEnabled(false); // 关闭
完整项目示例代码
这是一个结合了地图显示和定位的 MainActivity.java 完整代码。
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.BitmapDescriptor;
import com.baidu.mapapi.model.BitmapDescriptorFactory;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MapView mMapView;
private BaiduMap mBaiduMap;
private LocationClient mLocationClient;
private boolean isFirstLoc = true; // 是否是第一次定位
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化 SDK
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mMapView = findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
mBaiduMap.setMyLocationEnabled(true); // 开启定位图层
// 初始化定位
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setCoorType("bd09ll");
option.setScanSpan(1000); // 设置定位间隔,单位毫秒
mLocationClient.setLocOption(option);
mLocationClient.start();
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || mMapView == null) {
return;
}
// 构建定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处可设置方向的API方向信息,顺时针0-360
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(locData);
// 第一次定位时,将地图移动到当前位置
if (isFirstLoc) {
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(msu);
isFirstLoc = false;
}
// 添加一个标记
LatLng point = new LatLng(location.getLatitude(), location.getLongitude());
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_location_marker);
MarkerOptions option = new MarkerOptions().position(point).icon(bitmap);
mBaiduMap.addOverlay(option);
// 绘制一条简单的路线
drawRoute();
}
@Override
public void onConnectHotSpotMessage(String s, int i) {}
}
private void drawRoute() {
List<LatLng> points = new ArrayList<>();
points.add(new LatLng(39.963175, 116.400244)); // 天安门
points.add(new LatLng(39.910, 116.407)); // 故宫
points.add(new LatLng(39.920, 116.410)); // 景山公园
PolylineOptions polylineOption = new PolylineOptions()
.points(points)
.width(10)
.color(Color.BLUE);
mBaiduMap.addOverlay(polylineOption);
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
mLocationClient.stop(); // 停止定位
}
}
常见问题与注意事项
1 Key 校验失败
- 检查包名:确保
AndroidManifest.xml中package属性和申请 AK 时填写的包名完全一致。 - 检查 SHA1:确保调试版和发布版的 SHA1 都正确配置。
- 检查 AK:确保
AndroidManifest.xml中的API_KEY值正确无误。
2 地图不显示,一片灰色
- 网络问题:确保设备已连接互联网,并且有访问百度服务器的权限。
- 权限问题:确保已在
AndroidManifest.xml中添加了INTERNET权限。 - Key 问题:最常见的原因是 Key 校验失败。
- SO 文件问题:确保
libs或jniLibs目录下的所有.so文件都已正确添加。
3 网络权限问题
从 Android 6.0 (API 23) 开始,部分敏感权限需要在运行时动态申请,对于 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION,如果你的 targetSdkVersion 是 23 或更高,你需要在代码中动态请求这些权限。
4 混淆配置
在发布应用时,为了避免代码被混淆导致 SDK 无法工作,请在你的 proguard-rules.pro 文件中添加以下规则:
-keep class com.baidu.mapapi.**{*;}
-keep class com.baidu.location.**{*;}
-dontwarn com.baidu.mapapi.**
-dontwarn com.baidu.location.**
进阶学习资源
- 官方文档 (最重要):百度地图 Android SDK 开发指南
- 官方示例:下载完整的 SDK 包,里面包含了丰富的示例代码,覆盖了所有高级功能(如:地理编码、路径规划、搜索等)。
- API 文档:百度地图 Android API 文档
- 开发者社区:百度地图开放平台社区
希望这份详细的教程能帮助你顺利上手 Android 百度地图开发!祝你编码愉快!
