杰瑞科技汇

Android百度地图教程怎么用?

Android 百度地图 SDK 开发完整教程

目录

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

准备工作

在开始编码之前,必须完成以下准备工作。

Android百度地图教程怎么用?-图1
(图片来源网络,侵删)

1 注册成为百度地图开发者

  1. 访问 百度地图开放平台
  2. 点击右上角的“登录/注册”,使用百度账号登录。
  3. 登录后,进入“控制台”。

2 创建应用并获取 AK (API Key)

AK (Application Key) 是你的应用调用百度地图服务的凭证。

  1. 在控制台左侧菜单栏,点击“应用管理” -> “我的应用”。
  2. 点击“创建应用”,选择“Android SDK”。
  3. 填写应用信息:
    • 应用名称:给你的应用起个名字,如 "MyBaiduMapDemo"。
    • 包名非常重要! 填写你的 Android 项目的包名(在 app/build.gradle 文件的 applicationId 中可以找到,com.example.myapplication),这个必须和最终打包 APK 的包名完全一致。
    • 数字签名 (SHA1):这是用于验证应用身份的,你需要获取你的开发电脑或签名文件的 SHA1 值。
      • 获取方法 (Android Studio)
        1. 打开 Android Studio,点击菜单 Build -> Generate Signed Bundle / APK...
        2. 选择 APK 或 App Bundle,点击 "Next"。
        3. 在 "Key store path" 区域,点击 "Choose existing..." 或 "Create new...",如果是创建新的,会要求你设置密钥库密码、密钥密码和密钥别名,记住这些信息!
        4. 填写完信息后,Android Studio 会在下方显示 "Certificate fingerprint",这里的 SHA1 值就是你要复制的。
        5. (推荐)使用命令行获取:如果你已经有 debug.keystore (Android Studio 默认的调试密钥),可以在终端运行:
          keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

          复制其中的 SHA1 值。

  4. 填写完包名和 SHA1 后,点击“提交”。
  5. 在应用列表中,你会看到刚刚创建的应用,其右侧的“AK”列就是你的 API Key。请妥善保管此 Key

3 下载 SDK

  1. 在控制台左侧菜单,点击“开发文档” -> “Android SDK”。
  2. 在页面右侧找到“下载”按钮,进入下载页面。
  3. 根据你的需求选择要下载的功能包,通常下载 “基础地图包” 即可,它包含了核心地图功能,如果你需要定位、搜索、路线等功能,需要下载对应的扩展包。
  4. 下载后,你会得到一个 .zip 压缩包,解压后找到 BaiduMapSDK_Android_X.X.X.jarlibs 文件夹(里面是 .so 库文件)。

4 配置 Android Studio 项目

  1. 新建项目:在 Android Studio 中创建一个新的 Empty Activity 项目。
  2. 复制 JAR 和 SO 文件
    • 将下载的 BaiduMapSDK_Android_X.X.X.jar 复制到你的项目的 app/libs 目录下。
    • 将下载的 libs 文件夹(包含 armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 等子文件夹)中的所有内容,复制到你项目的 app/src/main/jniLibs 目录下。jniLibs 目录不存在,请手动创建。
  3. 添加 JAR 依赖
    • 右键点击 app/libs 目录下的 .jar 文件,选择 "Add As Library..."。
    • 在弹出的窗口中,选择 app 模块,点击 "OK"。
    • 或者,在 app/build.gradle 文件的 dependencies 代码块中手动添加:
      implementation files('libs/BaiduMapSDK_Android_X.X.X.jar')
  4. 配置 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.gradledependencies 中添加:

Android百度地图教程怎么用?-图2
(图片来源网络,侵删)
// 如果使用 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 中初始化地图

让我们在代码中启动地图。

Android百度地图教程怎么用?-图3
(图片来源网络,侵删)

打开 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

  1. 下载定位 SDK:在百度地图开放平台下载定位 SDK,并将 JAR 和 SO 文件按 1.4 节所述的方法添加到项目中。
  2. 添加依赖:在 app/build.gradle 中添加定位 SDK 的 JAR。
    implementation files('libs/BaiduLBS_Android.jar') // 定位 SDK 的 JAR
  3. 实现定位逻辑
// 在 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 运行正常,但地图区域是灰色或白色的。
  • 原因
    1. 网络权限未开启:App 没有网络连接,无法加载地图瓦片。
    2. 硬件加速被禁用AndroidManifest.xmlapplication 标签的 android:hardwareAccelerated="false"
    3. Key 问题:同上。
  • 解决
    1. 检查手机是否联网。
    2. 确保 application 标签中有 android:hardwareAccelerated="true"
    3. 再次检查 Key 配置。

3 模拟器定位问题

  • 问题:在模拟器上无法获取定位,或定位不准。
  • 原因:模拟器没有真实的 GPS 硬件。
  • 解决
    1. 使用模拟器位置模拟器:在 Android Studio 的模拟器工具栏中,有一个 "更多" (⋮) -> "模拟位置控制台" (Location emulator),可以手动设置一个经纬度。
    2. 使用 GPX/KML 文件:同样在 "模拟位置控制台" 中,可以加载一个 GPX 或 KML 文件来模拟一段轨迹。
    3. 使用真实设备测试:定位功能最终必须在真机上测试。

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 百度地图开发!如果遇到问题,请多查阅 百度地图官方开发文档,那里有最权威和最新的信息。

分享:
扫描分享到社交APP
上一篇
下一篇