Android studio进阶教程之(二)--如何导入高德地图

本次也是继续来更新Android的进阶教学了,还记得我曾经写过如何申请高德地图的key吗,今天我们就将高德地图放在我们的app中

基础权限配置

在androidManifest中配置以下权限:

java 复制代码
<!-- 用于访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 用于读取手机当前的状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 用于写入缓存数据到扩展存储卡 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于申请调用A-GPS模块 -->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

以及配置你自己在高德地图中申请的key:

java 复制代码
<meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="	your__key" />

bulid.gradle.kts的配置如下:

kotlin 复制代码
// 修正点 1:移除重复的 Kotlin 插件声明(版本冲突)
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)  // 确保版本目录中已定义 1.9.22
    // 移除下面这行重复的插件声明
    // id 'org.jetbrains.kotlin.android' version '1.9.22'
}

android {
    namespace = "com.example.gdmap"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.gdmap"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        ndk {  // 修正点 2:修复 ndk 块语法
            abiFilters.addAll(arrayOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64"))
        }
    }  // 注意这里闭合 defaultConfig

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    buildFeatures {
        viewBinding = true
    }

    sourceSets {
        getByName("main") {
            jniLibs.srcDir("libs")
        }
    }
}

dependencies {
    // 使用版本库中的依赖
    implementation(libs.appcompat)
    implementation(libs.material)
    implementation(libs.activity)
    implementation(libs.constraintlayout)
    implementation(libs.play.services.maps)
    testImplementation(libs.junit)
    androidTestImplementation(libs.ext.junit)
    androidTestImplementation(libs.espresso.core)

    // 修正点 3:统一 Kotlin BOM 版本(移除 1.8.0)
    dependencies {
        // ================== Kotlin 核心依赖 ==================
        implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.9.22")) // 统一管理 Kotlin 版本
        implementation("org.jetbrains.kotlin:kotlin-stdlib")              // 自动继承 BOM 版本
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") // 显式指定协程版本

        // ================== AndroidX 官方库 ==================
        implementation("androidx.appcompat:appcompat:1.6.1")
        implementation("com.google.android.material:material:1.11.0")       // Material Design 最新稳定版
        implementation("androidx.constraintlayout:constraintlayout:2.1.4")  // ConstraintLayout
        implementation("androidx.activity:activity-ktx:1.8.2")              // 推荐使用 ktx 版本

        // ================== 本地 JAR 依赖 ==================
        implementation(files("libs/QWeather_Public_Android_V4.17.jar"))
        implementation(files("libs/AMap3DMap_10.0.600_AMapSearch_9.7.1_AMapLocation_6.4.3_20240314.jar"))
        //implementation(files("libs/postgresql-42.7.3.jar"))  // 注意:建议改用远程依赖

        // ================== 测试依赖 ==================
        testImplementation("junit:junit:4.13.2")
        androidTestImplementation("androidx.test.ext:junit:1.1.5")
        androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")

        // ================== 网络与工具库 ==================
        implementation("com.google.code.gson:gson:2.10.1")                 // JSON 解析
        implementation("com.squareup.okhttp3:okhttp:4.12.0")               // 网络请求(支持 HTTP/2)
        implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")  // 可选:网络日志

        // ================== 权限管理 ==================
        // 原 easypermissions 替代方案(支持 AndroidX 和 Kotlin)
        implementation("com.guolindev.permissionx:permissionx:1.7.1")

        // ================== Navigation 组件 ==================
        implementation("androidx.navigation:navigation-fragment-ktx:2.7.7")
        implementation("androidx.navigation:navigation-ui-ktx:2.7.7")

        // ================== Google 服务 ==================
        implementation("com.google.android.gms:play-services-maps:18.2.0")  // 地图服务
    }
}

setting.gradle.kts配置如下:

kotlin 复制代码
在这里插入代码片
kotlin 复制代码
pluginManagement {
    repositories {
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        mavenCentral()
        gradlePluginPortal()
        google()


        maven { url=uri("https://jitpack.io")}
        maven { url =uri("https://maven.aliyun.com/repository/public") }
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url=uri("https://jitpack.io")}
        maven { url =uri("https://maven.aliyun.com/repository/public") }

    }
}

rootProject.name = "GDMap"
include(":app")
 

libs.versions.toml配置如下

java 复制代码
[versions]
agp = "8.7.3"                  # Android Gradle Plugin 版本 (com.android.application)
junit = "4.13.2"               # JUnit 4 版本
extJunit = "1.1.5"             # AndroidX Test Ext JUnit 版本
espressoCore = "3.5.1"         # Espresso 版本
appcompat = "1.6.1"            # AppCompat 版本
material = "1.10.0"            # Material Design 版本
activity = "1.8.0"             # AndroidX Activity 版本
constraintlayout = "2.1.4"     # ConstraintLayout 版本
playServicesMaps = "19.1.0"    # Google Play Services Maps 版本
junitJunit = "4.12"            # JUnit 旧版本(已废弃,建议移除)
kotlin = "1.9.22"              # Kotlin 版本(注意 AGP 8.7.3 需要 Kotlin 1.9.20)

[plugins]
# Android 应用插件
android-application = { id = "com.android.application", version.ref = "agp" }
# Kotlin 插件(修正点:移到 plugins 部分)
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

[libraries]
# 依赖库声明(修正点:移除 kotlin-android)
junit = { group = "junit", name = "junit", version.ref = "junit" }
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "extJunit" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
play-services-maps = { group = "com.google.android.gms", name = "play-services-maps", version.ref = "playServicesMaps" }

以及几个重要的安装包,建议在高德地图的官网中进行下载最新版并将其配置在libs中:

,这样前置环境就配置好了。

地图的导入

先创办AddShape类,用于初始化地图信息:

java 复制代码
package com.example.gdmap;

import android.graphics.Color;

import com.amap.api.maps.AMap;
import com.amap.api.maps.model.Circle;
import com.amap.api.maps.model.CircleOptions;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;

public class AddShape {

    //test:latitude:28.716667;longitude:115.821389

    /**
     * 设置基本的marker
     *
     * @param aMap 地图组件
     * @param latitude 纬度
     * @param longitude 经度
     * @param title 主标题
     * @param subtitle 副标题
     * @author HansAwake
     * @create 2025/1/11
     **/
    public static void setPoint(AMap aMap,double latitude,double longitude,String title,String subtitle){
        //设置经纬度,先纬度后经度
        LatLng latLng = new LatLng(latitude,longitude);
        //绘制Marker
        final Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title(title).snippet(subtitle));
    }


    /**
     * 设置基本的marker
     *
     * @param aMap 地图组件
     * @param latitude 纬度
     * @param longitude 经度
     * @param title 主标题
     * @param subtitle 副标题
     * @return com.amap.api.maps.model.Marker 返回设定好的Marker
     * @author HansAwake
     * @create 2025/1/11
     **/
    public static Marker setPoint_Marker(AMap aMap,double latitude,double longitude,String title,String subtitle){
        //设置经纬度,先纬度后经度
        LatLng latLng = new LatLng(latitude,longitude);
        //创建Marker选项
        MarkerOptions markerOptions = new MarkerOptions()
                .position(latLng)
                .title(title)
                .snippet(subtitle);
        //绘制并返回Marker
        return aMap.addMarker(markerOptions);
    }

    //设置边界面
    public static CircleOptions setPolygonalFence(AMap aMap,double latitude,double longitude,double r,int width){
        LatLng latLng = new LatLng(latitude,longitude);
        CircleOptions circleOptions = new CircleOptions().
                center(latLng).
                radius(r).//alpha是不透明度
                fillColor(Color.argb(100, 173,216,230)).
                strokeColor(Color.argb(130, 173,216,230)).
                strokeWidth(width);
        return circleOptions;
    }
    public static void setCircularFence(){

    }


}

之后创办map.activity之后copy代码就行:

xml文件如下(可以通过调整layout_width和layout_height对地图显示的范围进行调整):

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".Map">

    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Java代码如下,copy前记得看下相关库是否引用成功,否则会报错:

java 复制代码
package com.example.gdmap;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.amap.api.maps.CameraUpdate;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.Circle;
import com.amap.api.maps.model.CircleOptions;
import com.autonavi.amap.mapcore.interfaces.IUiSettings;
import com.example.gdmap.AddShape;

import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.MapsInitializer;
import com.amap.api.maps.model.MyLocationStyle;


public class Map extends AppCompatActivity {

    MapView mMapView = null;
    AMap aMap = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        MapsInitializer.updatePrivacyShow(getApplicationContext(),true,true);
        MapsInitializer.updatePrivacyAgree(getApplicationContext(),true);

        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.map);
        //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
        mMapView.onCreate(savedInstanceState);

        //初始化地图控制器对象
        if (aMap == null) {
            aMap = mMapView.getMap();
        }


        //定位小蓝点
        MyLocationStyle myLocationStyle;
        //初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
        //连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。
        //(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
        myLocationStyle = new MyLocationStyle();
        //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
        myLocationStyle.interval(6000);
        //设置定位蓝点的Style
        aMap.setMyLocationStyle(myLocationStyle);
        //aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
        // 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
        aMap.setMyLocationEnabled(true);
        //只定位一次。
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);

        //通过接口实例化非静态类方法
        aMap.getUiSettings().setRotateGesturesEnabled(false);//关闭旋转


        //设置希望展示的地图缩放级别
        //地图的缩放级别一共分为 17 级,从 3 到 19。数字越大,展示的图面信息越精细。
        CameraUpdate mCameraUpdate = CameraUpdateFactory.zoomTo(16);
        aMap.animateCamera(mCameraUpdate);
        //定位一次,且将视角移动到地图中心点。
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);
        // 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
        aMap.setMyLocationEnabled(true);
        aMap.getUiSettings().setScaleControlsEnabled(true);//控制比例尺控件是否显示




        //Marker
        AddShape addShape =new AddShape();
        addShape.setPoint(aMap,28.711666,115.826600,"小王","189xxxxxxxx");
        addShape.setPoint(aMap,28.711667,115.826750,"小王","189xxxxxxxx");
        addShape.setPoint(aMap,28.711680,115.826450,"小王","189xxxxxxxx");
        addShape.setPoint(aMap,28.711686,115.826589,"小王","189xxxxxxxx");
        addShape.setPoint(aMap,28.715677,115.826589,"测试","1122444");
        addShape.setPoint(aMap,28.720688,115.826589,"测试","1122555");
        addShape.setPoint(aMap,28.725699,115.826589,"测试","1122666");

        CircleOptions circle =  addShape.setPolygonalFence(aMap,28.720688,115.826589,100,20);
        aMap.addCircle(circle);

    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
        mMapView.onDestroy();
    }
    @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 onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
        mMapView.onSaveInstanceState(outState);
    }



}

之后打开模拟器,进行运行即可:

这里我设置了高德地图只占屏幕的一般,在xml中可自行调整

注意:

部分模拟器的定位通常不准,所以会默认在北京,想要真实体验的话建议用真机,而且模拟器的网络ip与名称与你当前电脑的网络是不同的,这对以后的网络通信有一定的影响,所以有能力的尽量使用真机。

相关推荐
踢球的打工仔11 小时前
PHP面向对象(7)
android·开发语言·php
安卓理事人11 小时前
安卓socket
android
时光追逐者16 小时前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio
安卓理事人17 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学18 小时前
Android M3U8视频播放器
android·音视频
q***577418 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober19 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
王六岁19 小时前
UIAutomatorViewer 安装指南 (macOS m3pro 芯片)
android studio
城东米粉儿19 小时前
关于ObjectAnimator
android
zhangphil20 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android