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