杰瑞科技汇

Android百度地图怎么用?入门教程有哪些?

目录

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

准备工作

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

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

1 申请百度地图开放平台 AK (密钥)

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

  1. 注册账号:访问 百度地图开放平台,使用百度账号登录。
  2. 创建应用
    • 登录后,进入 “控制台” -> “应用管理” -> “我的应用” -> “创建应用”。
    • 选择应用类型,对于 Android 开发,选择 Android SDK
    • 填写应用信息
      • 应用名称:给你的应用起个名字,如 "MyBaiduMapDemo"。
      • 包名非常重要! 填写你的 Android 项目的包名(在 app/build.gradle 文件的 applicationId 中可以找到,com.example.myapplication)。
      • SHA1非常重要! 这是你的应用签名文件的哈希值,用于验证你的应用身份。
        • 如何获取 SHA1
          1. 在 Android Studio 中,打开你的项目。
          2. 点击菜单栏的 Build -> Generate Signed Bundle / APK...
          3. 选择 APK,点击 Next
          4. 如果没有签名,点击 Create new... 创建一个新的,如果已有,选择它。
          5. 在弹出的窗口中,找到 Certificate 部分,复制 SHA-1 后面的值。
          6. 注意:如果你使用的是 Android Studio 的默认调试签名,可以在 Terminal (终端) 中运行以下命令获取:
            keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

            复制 SHA-1 的值。

    • 发布版 SHA1:如果需要发布到应用市场,你需要为你的正式签名文件再申请一个 SHA1,在开发阶段,可以先不填。
  3. 获取 AK:创建成功后,在应用列表中找到你创建的应用,即可看到 AK请务必复制并保存好这个 AK

2 下载百度地图 Android SDK

  1. 访问 百度地图 Android SDK 下载页面
  2. 选择你需要的 SDK 版本和功能模块,对于初学者,选择“基础地图”即可。
  3. 下载后,你会得到一个 .zip 压缩包,解压后,主要关注 BaiduMapSDK_android_xxx.jar (核心库) 和 libs 文件夹 (so 文件)。

3 配置 Android Studio 项目

  1. 新建项目:在 Android Studio 中创建一个新的 Empty Activity 项目。
  2. 复制 SDK 文件
    • 将解压后的 BaiduMapSDK_android_xxx.jar 复制到你的项目的 app/libs 目录下。
    • 将解压后的 libs 目录下的所有 .so 文件,复制到你项目的 app/src/main/jniLibs 目录下。jniLibs 目录不存在,请手动创建。
  3. 添加依赖
    • 打开 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']
              }
          }
      }
  4. 添加网络权限
    • 打开 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,替换为以下内容:

Android百度地图怎么用?入门教程有哪些?-图2
(图片来源网络,侵删)
<?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。

  1. 打开 app/src/main/AndroidManifest.xml
  2. <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,如果一切顺利,你应该能看到一个可以缩放、拖动的中国地图了!

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

核心功能详解

1 定位 (我的位置)

定位需要额外的 Location SDK

  1. 下载并配置 Location SDK:重复 1.2 和 1.3 步骤,下载 Location SDK,并将 JAR 和 SO 文件添加到你的项目中。
  2. 添加定位权限:在 AndroidManifest.xml 中添加:
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  3. 实现定位逻辑
// 在 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.xmlpackage 属性和申请 AK 时填写的包名完全一致。
  • 检查 SHA1:确保调试版和发布版的 SHA1 都正确配置。
  • 检查 AK:确保 AndroidManifest.xml 中的 API_KEY 值正确无误。

2 地图不显示,一片灰色

  • 网络问题:确保设备已连接互联网,并且有访问百度服务器的权限。
  • 权限问题:确保已在 AndroidManifest.xml 中添加了 INTERNET 权限。
  • Key 问题:最常见的原因是 Key 校验失败。
  • SO 文件问题:确保 libsjniLibs 目录下的所有 .so 文件都已正确添加。

3 网络权限问题

从 Android 6.0 (API 23) 开始,部分敏感权限需要在运行时动态申请,对于 ACCESS_FINE_LOCATIONACCESS_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 百度地图开发!祝你编码愉快!

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