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与名称与你当前电脑的网络是不同的,这对以后的网络通信有一定的影响,所以有能力的尽量使用真机。

相关推荐
_小马快跑_1 分钟前
ConstraintLayout之layout_constraintDimensionRatio属性详解
android
人猿泰飞41 分钟前
【初识Trae】字节跳动推出的下一代AI原生IDE,重新定义智能编程
ide·ai-native·trae·ai原生ide
百锦再1 小时前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗1 小时前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO1 小时前
Android APP 热修复原理
android·app·frida·hotfix·热修复
timing9942 小时前
LVGL在VScode的WSL2中仿真
ide·vscode·编辑器
火柴就是我2 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade3 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下3 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
未来之窗软件服务3 小时前
声音分离人声和配乐-从头设计数字生命第4课——仙盟创梦IDE
ide·仙盟创梦ide·数字生命