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

发布于:2025-04-02 ⋅ 阅读:(17) ⋅ 点赞:(0)

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

基础权限配置

在androidManifest中配置以下权限:

<!-- 用于访问网络,网络定位需要上网 -->
    <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:

<meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="	your__key" />

bulid.gradle.kts的配置如下:

// 修正点 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配置如下:

在这里插入代码片
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配置如下

[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类,用于初始化地图信息:

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 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前记得看下相关库是否引用成功,否则会报错:

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


网站公告

今日签到

点亮在社区的每一天
去签到