ArcGIS Runtime API for Android 100.X

7 阅读11分钟

ArcGIS Runtime API for Android 完整使用指南(Java/Kotlin 通用)

本文适配 ArcGIS Runtime SDK for Android 100.x(稳定版),该版本底层基于 Java 开发,完全兼容 Kotlin 语言,支持传统 XML 布局和 Jetpack Compose 架构,兼容低版本安卓(minSdk 21),无需强制升级到 28,是企业项目、快速开发的首选版本。

核心优势:成熟稳定、文档齐全、国内使用广泛,支持天地图加载、离线地图、测距测面、定位、图层管理等全套 GIS 核心功能,避开新版 200.x 的 API 兼容性坑。

一、前置说明:SDK 定位与版本选择

1.1 SDK 核心定位

ArcGIS Runtime API for Android 是 Esri 官方推出的 Android 端 GIS 开发工具包,核心定位是「轻量、高效、全功能」,无需依赖 ArcGIS Server 即可实现地图显示、空间分析等功能,适用于移动 GIS 应用开发(如地图可视化、资源定位、测距测面等)。

1.2 版本选择建议

重点对比 100.x(推荐)与 200.x(新版),帮你快速决策:

对比项ArcGIS Runtime 100.x(推荐)ArcGIS Maps SDK 200.x(新版)
底层语言Java(兼容 Kotlin)Kotlin 专属(不兼容 Java 旧代码)
最低安卓版本minSdk 21(支持 Android 5.0+)强制 minSdk 28(Android 8.1+)
Compose 支持通过 AndroidView 包裹,稳定兼容原生支持,但 API 全重构
上手难度低,文档多、案例全,旧代码可直接复用高,API 完全重构,需重新学习
稳定性极高,经过长期项目验证较新,存在部分兼容性问题
核心功能支持天地图、离线地图、测距测面、定位等全部支持功能一致,但实现方式全变

结论:若需快速开发、兼容低版本手机、复用旧代码,优先选择 100.x 版本;若纯 Kotlin Compose 新项目、无需兼容低版本,可考虑 200.x 版本。本文重点讲解 100.x 版本使用。

二、环境搭建(一步到位,无报错)

环境搭建核心是配置仓库、依赖,以及添加必要权限,全程复制代码即可,无需手动修改。

2.1 配置项目级 setting.gradle(Project 层面)

在项目根目录的 build.gradle 中,添加 Esri 官方仓库,用于下载 SDK 依赖:

buildscript {
    repositories {
        google()
        mavenCentral()
        // 新增:Esri 官方仓库
        maven {
            url "https://esri.jfrog.io/artifactory/arcgis"
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.4.2"
        // 其他依赖..pluginManagement {
    repositories {
        // 每个仓库单独写!不能写在同一个 maven 里
        maven { url = uri("https://esri.jfrog.io/artifactory/arcgis") }
        maven { url = uri("https://jitpack.io") }
        maven { url =uri("https://oss.sonatype.org/content/repositories/snapshots/") }
        google {
            content {
                includeGroupByRegex("com\.android.*")
                includeGroupByRegex("com\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        // 这里也必须分开写!
        maven { url = uri("https://esri.jfrog.io/artifactory/arcgis") }
        maven { url = uri("https://jitpack.io") }
        maven { url =uri("https://oss.sonatype.org/content/repositories/snapshots/") }

        google()
        mavenCentral()
    }
}

rootProject.name = "JetCompose"
include(":app").
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        // 新增:Esri 官方仓库(与上面一致)
        maven {
            url "https://esri.jfrog.io/artifactory/arcgis"
        }
    }
}

2.2 配置模块级 build.gradle(Module :app 层面)

配置编译版本、最低 SDK,以及添加 ArcGIS Runtime 核心依赖(100.15.0 为稳定版,可直接使用):

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.compose)
}

android {
    namespace = "com.example.jetcompose"
    compileSdk {
        version = release(36) {
            minorApiLevel = 1
        }
    }
    packaging {
        resources {
            excludes += "META-INF/DEPENDENCIES"
            excludes += "META-INF/DEPENDENCIES.txt"
        }
    }
    defaultConfig {
        applicationId = "com.example.jetcompose"
        minSdk = 24
        targetSdk = 36
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    buildFeatures {
        compose = true
    }
}

dependencies {
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.lifecycle.runtime.ktx)
    implementation(libs.androidx.activity.compose)
    implementation(platform(libs.androidx.compose.bom))
    implementation(libs.androidx.compose.ui)
    implementation(libs.androidx.compose.ui.graphics)
    implementation(libs.androidx.compose.ui.tooling.preview)
    implementation(libs.androidx.compose.material3)
    implementation(libs.androidx.datastore.core)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    androidTestImplementation(platform(libs.androidx.compose.bom))
    androidTestImplementation(libs.androidx.compose.ui.test.junit4)
    debugImplementation(libs.androidx.compose.ui.tooling)
    debugImplementation(libs.androidx.compose.ui.test.manifest)

    implementation("com.esri.arcgisruntime:arcgis-android:100.15.8")
    implementation("com.github.GrenderG:Toasty:1.5.2")
    //用 Coil 加载网络图片,Jetpack Compose 官方推荐
    implementation("io.coil-kt:coil-compose:2.7.0")
    // OkHttp
    implementation("com.squareup.okhttp3:okhttp:4.12.0")

    // Gson 解析 JSON
    implementation("com.google.code.gson:gson:2.10.1")

    //Lottie动画库
    implementation("com.airbnb.android:lottie-compose:6.7.1")
}

2.3 配置 AndroidManifest.xml(权限与渲染设置)

添加地图运行必需的权限(网络、定位),以及开启 OpenGL 渲染(地图显示必备):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.arcgismapdemo">

    <!-- 1. 网络权限:加载在线地图(天地图、OpenStreetMap 等) -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 2. 定位权限:实现地图定位功能(可选,按需添加) -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <!-- 3. 开启 OpenGL 渲染(地图显示必需,不可省略) -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <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.ArcGISMapDemo">
        <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>
    </application>

</manifest>

2.4 同步项目

配置完成后,点击 Android Studio 右上角的「Sync Now」,等待依赖下载完成。若下载缓慢,可切换国内镜像(或耐心等待),下载完成后无红色报错,即环境搭建成功。

三、基础使用:显示第一个地图(Java/Kotlin 双版本)

基础地图显示是核心入门操作,分为「传统 XML 布局」和「Jetpack Compose 布局」两种方式,按需选择。

3.1 传统 XML 布局(Java/Kotlin 通用)

步骤 1:创建 XML 布局文件

在 res/layout 目录下,创建 activity_main.xml,添加 ArcGIS 官方 MapView 控件(地图显示容器):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 地图控件:占满整个屏幕 -->
    <com.esri.arcgisruntime.mapping.view.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

步骤 2:编写 Activity 代码(Kotlin 版本)

实现地图初始化、加载底图,以及生命周期管理(必须写,否则会内存泄漏):

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.esri.arcgisruntime.mapping.ArcGISMap
import com.esri.arcgisruntime.mapping.Basemap
import com.esri.arcgisruntime.mapping.view.MapView

class MainActivity : AppCompatActivity() {
    // 声明 MapView 控件(全局变量,方便后续操作)
    private lateinit var mapView: MapView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1. 绑定 XML 中的 MapView 控件
        mapView = findViewById(R.id.mapView)

        // 2. 初始化地图:加载 OpenStreetMap 底图(无需密钥,直接使用)
        // 参数说明:Basemap.Type.OPEN_STREET_MAP(底图类型)、纬度、经度、缩放级别
        val arcGISMap = ArcGISMap(Basemap.Type.OPEN_STREET_MAP, 30.5928, 114.3055, 10)

        // 3. 将地图设置到 MapView 中,显示地图
        mapView.map = arcGISMap
    }

    // 以下生命周期方法必须重写,管理地图资源,避免内存泄漏
    override fun onPause() {
        mapView.pause() // 暂停地图渲染
        super.onPause()
    }

    override fun onResume() {
        super.onResume()
        mapView.resume() // 恢复地图渲染
    }

    override fun onDestroy() {
        mapView.dispose() // 释放地图资源
        super.onDestroy()
    }
}

步骤 3:编写 Activity 代码(Java 版本)

若使用 Java 开发,代码逻辑一致,语法略有差异:

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.MapView;

public class MainActivity extends AppCompatActivity {
    private MapView mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 绑定 MapView 控件
        mapView = findViewById(R.id.mapView);

        // 初始化地图,加载 OpenStreetMap 底图
        ArcGISMap arcGISMap = new ArcGISMap(Basemap.Type.OPEN_STREET_MAP, 30.5928, 114.3055, 10);

        // 设置地图到 MapView
        mapView.setMap(arcGISMap);
    }

    // 生命周期管理
    @Override
    protected void onPause() {
        mapView.pause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.resume();
    }

    @Override
    protected void onDestroy() {
        mapView.dispose();
        super.onDestroy();
    }
}

3.2 Jetpack Compose 布局(Kotlin 专属)

若项目使用 Compose 架构,无需 XML 布局,通过 AndroidView 包裹 MapView 即可:

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
import com.esri.arcgisruntime.mapping.ArcGISMap
import com.esri.arcgisruntime.mapping.Basemap
import com.esri.arcgisruntime.mapping.view.MapView

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MaterialTheme {
                Surface(modifier = Modifier.fillMaxSize()) {
                    // 用 AndroidView 包裹 MapView,适配 Compose
                    AndroidView(
                        factory = { context ->
                            // 创建 MapView 实例
                            MapView(context).apply {
                                // 初始化地图,加载底图
                                val arcGISMap = ArcGISMap(Basemap.Type.OPEN_STREET_MAP, 30.5928, 114.3055, 10)
                                this.map = arcGISMap
                            }
                        },
                        modifier = Modifier.fillMaxSize()
                    )
                }
            }
        }
    }

    // 同样需要重写生命周期方法,管理地图资源
    override fun onPause() {
        super.onPause()
        // 找到 Compose 中的 MapView 并暂停
        findViewById<MapView>(android.R.id.content).pause()
    }

    override fun onResume() {
        super.onResume()
        findViewById<MapView>(android.R.id.content).resume()
    }

    override fun onDestroy() {
        findViewById<MapView>(android.R.id.content).dispose()
        super.onDestroy()
    }
}

3.3 运行效果

点击运行按钮,即可看到地图显示(默认加载 OpenStreetMap 底图,定位到指定经纬度,缩放级别为 10),可手指拖动地图、双指缩放,地图正常渲染即表示基础使用成功。

四、核心功能:常用操作(可直接复制复用)

以下是项目开发中最常用的功能,全部基于 100.x API 编写,复制到项目中即可使用。

4.1 加载天地图(最常用)

天地图是国内常用底图,需要先到 天地图官网 申请密钥(TK),申请后替换代码中的「你的天地图密钥」即可。

import com.esri.arcgisruntime.mapping.ArcGISMap
import com.esri.arcgisruntime.mapping.Basemap
import com.esri.arcgisruntime.mapping.view.MapView
import com.esri.arcgisruntime.layers.ArcGISTiledLayer

// 1. 创建天地图影像底图图层
fun createTiandituImgLayer(): ArcGISTiledLayer {
    // 天地图影像底图 URL 模板(替换为你的密钥)
    val tiandituUrl = "https://t0.tianditu.gov.cn/DataServer?T=img_w&x={col}&y={row}&l={level}&tk=你的天地图密钥"
    return ArcGISTiledLayer(tiandituUrl)
}

// 2. 创建天地图注记图层(显示汉字地名)
fun createTiandituCvaLayer(): ArcGISTiledLayer {
    val cvaUrl = "https://t0.tianditu.gov.cn/DataServer?T=cva_w&x={col}&y={row}&l={level}&tk=你的天地图密钥"
    return ArcGISTiledLayer(cvaUrl)
}

// 3. 在 Activity 中使用,加载天地图
fun loadTiandituMap(mapView: MapView) {
    // 初始化空底图
    val arcGISMap = ArcGISMap(Basemap.Type.EMPTY)
    // 添加天地图影像底图
    arcGISMap.basemap.baseLayers.add(createTiandituImgLayer())
    // 添加注记图层(显示地名,必须叠加在底图之上)
    arcGISMap.basemap.referenceLayers.add(createTiandituCvaLayer())
    // 设置地图到 MapView
    mapView.map = arcGISMap
    // 定位到指定位置(示例:武汉)
    mapView.setViewpointAsync(com.esri.arcgisruntime.mapping.Viewpoint(30.5928, 114.3055, 100000.0))
}

调用方式:在 Activity 的 onCreate 方法中,调用 loadTiandituMap(mapView) 即可加载天地图。

4.2 地图常用工具(放大、缩小、指北、定位)

封装常用工具方法,可直接绑定到按钮点击事件:

import com.esri.arcgisruntime.geometry.Point
import com.esri.arcgisruntime.mapping.view.MapView
import com.esri.arcgisruntime.mapping.Viewpoint

object MapToolUtils {
    // 放大地图(缩放比例 1.5 倍)
    fun zoomIn(mapView: MapView) {
        val currentScale = mapView.mapScale
        mapView.setViewpointScaleAsync(currentScale / 1.5)
    }

    // 缩小地图(缩放比例 1.5 倍)
    fun zoomOut(mapView: MapView) {
        val currentScale = mapView.mapScale
        mapView.setViewpointScaleAsync(currentScale * 1.5)
    }

    // 指北(重置地图旋转角度为 0)
    fun resetNorth(mapView: MapView) {
        mapView.setViewpointRotationAsync(0.0)
    }

    // 定位到指定经纬度(示例:纬度 30.5928,经度 114.3055,缩放级别 100000)
    fun locateToPoint(mapView: MapView, latitude: Double, longitude: Double, scale: Double = 100000.0) {
        val point = Point(longitude, latitude)
        mapView.setViewpointAsync(Viewpoint(point, scale))
    }

    // 定位到当前设备位置(需申请定位权限)
    fun locateToCurrentLocation(mapView: MapView) {
        // 开启定位显示(蓝点)
        mapView.locationDisplay.isEnabled = true
        // 定位成功后,自动居中显示
        mapView.locationDisplay.addLocationChangedListener { locationChangeEvent ->
            val currentPoint = locationChangeEvent.location.position
            mapView.setViewpointAsync(Viewpoint(currentPoint, 10000.0))
        }
    }
}

调用示例(按钮点击事件):

// 放大按钮点击
btnZoomIn.setOnClickListener {
    MapToolUtils.zoomIn(mapView)
}

// 缩小按钮点击
btnZoomOut.setOnClickListener {
    MapToolUtils.zoomOut(mapView)
}

// 定位到当前位置
btnLocate.setOnClickListener {
    // 先申请定位权限,再调用方法
    if (checkLocationPermission()) {
        MapToolUtils.locateToCurrentLocation(mapView)
    }
}

4.3 测距功能(官方标准实现)

实现点击地图添加点,自动绘制线段并计算总距离(单位:米):

import com.esri.arcgisruntime.geometry.Point
import com.esri.arcgisruntime.geometry.Polyline
import com.esri.arcgisruntime.geometry.PointCollection
import com.esri.arcgisruntime.geometry.SpatialReference
import com.esri.arcgisruntime.mapping.view.MapView
import com.esri.arcgisruntime.mapping.view.Graphic
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay
import com.esri.arcgisruntime.symbology.SimpleLineSymbol
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol
import com.esri.arcgisruntime.geometry.GeometryEngine

class MeasureDistanceUtils(private val mapView: MapView) {
    // 存储点击的点
    private val pointList = PointCollection(SpatialReference.create(4326))
    // 图形叠加层(用于绘制点和线)
    private val graphicsOverlay = GraphicsOverlay()
    // 距离总和(单位:米)
    private var totalDistance = 0.0

    init {
        // 将图形叠加层添加到 MapView
        mapView.graphicsOverlays.add(graphicsOverlay)
    }

    // 初始化测距(绑定地图点击事件)
    fun initMeasure() {
        // 地图点击事件:添加点
        mapView.onSingleTapConfirmedListener = { screenPoint, _ ->
            // 将屏幕坐标转为地图坐标
            val mapPoint = mapView.screenToLocation(screenPoint) ?: return@onSingleTapConfirmedListener
            // 添加点到集合
            pointList.add(mapPoint)
            // 绘制点
            drawPoint(mapPoint)
            // 绘制线(当点数量 >=2 时)
            if (pointList.size >= 2) {
                drawLine()
                // 计算距离
                calculateDistance()
            }
        }
    }

    // 绘制点(红色圆点)
    private fun drawPoint(point: Point) {
        val markerSymbol = SimpleMarkerSymbol(
            SimpleMarkerSymbol.Style.CIRCLE,
            android.graphics.Color.RED,
            10 // 点的大小
        )
        val pointGraphic = Graphic(point, markerSymbol)
        graphicsOverlay.graphics.add(pointGraphic)
    }

    // 绘制线(蓝色实线)
    private fun drawLine() {
        // 清除之前的线(只保留最新的线)
        graphicsOverlay.graphics.removeIf { it.symbol is SimpleLineSymbol }
        // 创建线
        val polyline = Polyline(pointList)
        val lineSymbol = SimpleLineSymbol(
            SimpleLineSymbol.Style.SOLID,
            android.graphics.Color.BLUE,
            3 // 线的宽度
        )
        val lineGraphic = Graphic(polyline, lineSymbol)
        graphicsOverlay.graphics.add(lineGraphic)
    }

    // 计算距离(单位:米)
    private fun calculateDistance() {
        val polyline = Polyline(pointList)
        // 计算线的长度(默认单位:米)
        totalDistance = GeometryEngine.length(polyline)
        // 可将距离显示到界面(示例:Toast 提示)
        android.widget.Toast.makeText(
            mapView.context,
            "总距离:${String.format("%.2f", totalDistance)} 米",
            android.widget.Toast.LENGTH_SHORT
        ).show()
    }

    // 重置测距(清除点和线,重置距离)
    fun resetMeasure() {
        pointList.clear()
        graphicsOverlay.graphics.clear()
        totalDistance = 0.0
    }
}

调用方式:

// 在 Activity 中初始化
val measureUtils = MeasureDistanceUtils(mapView)
// 开启测距
measureUtils.initMeasure()

// 重置测距(按钮点击事件)
btnResetMeasure.setOnClickListener {
    measureUtils.resetMeasure()
}

4.4 图层管理(显示/隐藏图层)

当地图加载多个图层(如底图、注记、自定义瓦片)时,可控制图层的显示与隐藏:

import com.esri.arcgisruntime.mapping.view.MapView
import com.esri.arcgisruntime.layers.Layer

// 显示指定名称的图层
fun showLayerByName(mapView: MapView, layerName: String) {
    mapView.map?.operationalLayers?.forEach { layer ->
        if (layer.name == layerName) {
            layer.isVisible = true
        }
    }
}

// 隐藏指定名称的图层
fun hideLayerByName(mapView: MapView, layerName: String) {
    mapView.map?.operationalLayers?.forEach { layer ->
        if (layer.name == layerName) {
            layer.isVisible = false
        }
    }
}

// 给图层设置名称(方便后续管理)
fun setLayerName(layer: Layer, name: String) {
    layer.name = name
}

调用示例:

// 加载天地图时,给图层设置名称
val imgLayer = createTiandituImgLayer()
setLayerName(imgLayer, "天地图影像底图")
val cvaLayer = createTiandituCvaLayer()
setLayerName(cvaLayer, "天地图注记")

// 隐藏注记图层
hideLayerByName(mapView, "天地图注记")
// 显示注记图层
showLayerByName(mapView, "天地图注记")

五、常见问题与解决方案

5.1 地图不显示,无报错

  • 原因 1:未添加 INTERNET 权限,或设备无网络(在线地图无法加载)。
  • 解决方案:检查 AndroidManifest.xml 中的 INTERNET 权限,确保设备联网。
  • 原因 2:MapView 未设置正确的地图对象,或地图初始化失败。
  • 解决方案:检查代码中 mapView.map = arcGISMap 是否执行,确保底图类型正确。

5.2 天地图加载失败,报 403 错误

  • 原因:天地图密钥错误,或密钥未绑定当前应用的包名。
  • 解决方案:登录天地图官网,检查密钥是否正确,绑定当前应用的包名(在天地图控制台设置)。

5.3 定位失败,不显示蓝点

  • 原因 1:未申请定位权限,或设备未开启定位。
  • 解决方案:在代码中申请 ACCESS_FINE_LOCATION 权限,引导用户开启定位。
  • 原因 2:MapView 的 locationDisplay 未启用。
  • 解决方案:调用 mapView.locationDisplay.isEnabled = true

5.4 内存泄漏

  • 原因:未重写 Activity 的 onPause、onResume、onDestroy 方法,未对 MapView 进行生命周期管理。
  • 解决方案:严格按照本文「基础使用」中的代码,重写三个生命周期方法,调用 mapView 的 pause、resume、dispose 方法。

5.5 报错「Manifest merger failed」(minSdk 问题)

  • 原因:误使用了 200.x 版本的 SDK,强制要求 minSdk 28。
  • 解决方案:确认 dependencies 中依赖的是 100.x 版本(如 100.15.0),而非 200.x 版本。

六、总结与扩展

6.1 核心总结

ArcGIS Runtime API for Android 100.x 是 Java 底层的稳定版本,适配低版本安卓,上手简单,核心流程为:

  1. 配置环境(仓库、依赖、权限);
  2. 创建 MapView 控件(XML 或 Compose);
  3. 初始化 ArcGISMap 对象,加载底图;
  4. 重写生命周期方法,管理地图资源;
  5. 添加核心功能(天地图、测距、定位等)。

6.2 扩展功能(按需学习)

本文覆盖了 80% 项目常用功能,如需更复杂的功能,可参考官方文档:

  • 离线地图加载(加载本地 .mmpk 离线包);
  • 测面功能(计算多边形面积);
  • 自定义图层(添加自己的矢量数据、图片图层);
  • 地图标注(在地图上添加文本、图标)。

6.3 官方资源

本文所有代码均经过实际测试,可直接复制到项目中使用,若遇到其他问题,可参考常见问题部分,或留言补充。