当前位置: 首页 > news >正文

在Fragment中显示高德地图

一、首先在高德官网上申请key

  • 第一步:按照规定填写Key名称
  • 第二步:选择服务平台,运用在android上就勾选anroid就好了
  • 第三步:输入发布版安全码SHA1
    • 首先打开命令行按住windows+r两个按键
    • 在命令行中输入cd .android,定位到.android文件下
    • 调试版本使用 debug.keystore,命令为:keytool -list -v -keystore debug.keystore 发布版本使用 apk 对应的 keystore,命令为:keytool -list -v -keystore apk的keystore 如下所示:
    • 默认密钥库口令是:android
  • 第四步:输入PackageName:通常在清单文件的开头会有app的包名。
  • 第五步:点击确定就会生成一key

二、在Fragment中的运用

1.首先引入高德地图的依赖

//3D地图so及jarimplementation 'com.amap.api:3dmap:latest.integration'

2.在清单文件中写如下代码

        <meta-data android:name="com.amap.api.v2.apikey" android:value="你的自己的key"/>
<service android:name="com.amap.api.location.APSService" />

3.在清单文件中申明权限

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

4.新建Fragment

import static com.amap.api.location.AMapLocationClient.updatePrivacyAgree;
import static com.amap.api.location.AMapLocationClient.updatePrivacyShow;import androidx.lifecycle.ViewModelProvider;import android.os.Bundle;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.ear.ams.ui.baseActivity.BaseFragment;
import com.ear.ams.ui.baseActivity.BaseFragmentTitleBarListener;
import com.ear.ams.ui.functionpage.distinguish.ModifyWarehouseDetialViewModel;
import com.ear.ams.ui.functionpage.distinguish.WarehouseChipDetialViewModel;
import com.ear.ams.util.loginUtil.LoginUtil;
import com.ear.ams_android.databinding.FragmentDetailedMapBinding;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.interfaces.OnConfirmListener;public class DetailedMapFragment extends BaseFragment implements AMapLocationListener {private DetailedMapViewModel viewModel;private FragmentDetailedMapBinding binding;private MapView mapView;private AMap aMap;private AMapLocationClient locationClient;private Marker centerMarker;public static DetailedMapFragment newInstance() {return new DetailedMapFragment();}@Overridepublic void onStart() {super.onStart();setTitle("位置");}}private String a;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);viewModel = new ViewModelProvider(this).get(DetailedMapViewModel.class);initListener();setTitleBarListener(new BaseFragmentTitleBarListener() {@Overridepublic void onRightClick() {if (centerMarker != null) {LatLng position = centerMarker.getPosition();viewModel.latDL.setValue(position.latitude);viewModel.lngDL.setValue(position.longitude);Toast.makeText(getActivity(), "您选择的位置是: Lat=" + position.latitude + ", Lon=" + position.longitude, Toast.LENGTH_SHORT).show();}viewModel.selectSuccessfulLD.setValue(true);}});}@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {if (binding == null) {binding = FragmentDetailedMapBinding.inflate(inflater, container, false);binding.setViewModel(viewModel);binding.setLifecycleOwner(this);updatePrivacyShow(getContext(), true, true);updatePrivacyAgree(getContext(), true);mapView = binding.map;mapView.onCreate(savedInstanceState);if (aMap == null) {aMap = mapView.getMap();}try {setupLocation();} catch (Exception e) {throw new RuntimeException(e);}// 初始化中心标记centerMarker = null;aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {@Overridepublic void onMapLoaded() {// 地图加载完成后,将中心标记添加到地图中心LatLng center = aMap.getCameraPosition().target;MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(center);markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));centerMarker = aMap.addMarker(markerOptions);// 监听地图移动事件以更新中心标记的位置aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {@Overridepublic void onCameraChange(CameraPosition cameraPosition) {if (centerMarker != null) {centerMarker.setPosition(cameraPosition.target);}}@Overridepublic void onCameraChangeFinish(CameraPosition cameraPosition) {// 可以选择在这里添加额外的处理}});}});}View root = binding.getRoot();return root;}private void setupLocation() throws Exception {locationClient = new AMapLocationClient(getActivity().getApplicationContext());locationClient.setLocationListener(this);AMapLocationClientOption locationOption = new AMapLocationClientOption();locationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);locationClient.setLocationOption(locationOption);locationClient.startLocation();}@Overridepublic void onResume() {super.onResume();mapView.onResume();getView().setFocusableInTouchMode(true);getView().requestFocus();getView().setOnKeyListener(new View.OnKeyListener() {//这里为Fragment的视图设置了一个键盘监听器。当用户在键盘上按下一个键时,这个监听器会被触发。@Overridepublic boolean onKey(View view, int i, KeyEvent keyEvent) {if (i == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_UP) {LoginUtil.getInstance().setFlag("0");}return false;}});}@Overridepublic void onPause() {super.onPause();mapView.onPause();// 如果需要停止定位服务,可以在这里调用locationClient.stopLocation();locationClient.stopLocation();}@Overridepublic void onDestroyView() {super.onDestroyView();mapView.onDestroy();if (null != locationClient) {locationClient.onDestroy();locationClient = null;}}@Overridepublic void onLowMemory() {super.onLowMemory();mapView.onLowMemory();}@Overridepublic void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {}AMapLocation aMapLocation;private boolean isCurrentLocationMarkerAdded = false;private void initListener() {viewModel.selectSuccessfulLD.observe(this, a1 -> {new XPopup.Builder(getContext()).dismissOnBackPressed(false).dismissOnTouchOutside(false).asConfirm("提示", "选择成功!", null, "确定", new OnConfirmListener() {@Overridepublic void onConfirm() {if (a.equals("3")) {LoginUtil.getInstance().setlat3(String.valueOf(viewModel.latDL.getValue()));LoginUtil.getInstance().setlng3(String.valueOf(viewModel.lngDL.getValue()));} else if (a.equals("2")) {LoginUtil.getInstance().setlat2(String.valueOf(viewModel.latDL.getValue()));LoginUtil.getInstance().setlng2(String.valueOf(viewModel.lngDL.getValue()));}popBackFragment();}}, null, true).show();});viewModel.getIsLoadingLD().observe(this, result -> {if (viewModel.latDL.getValue()==0.0) {if (aMapLocation != null && aMapLocation.getErrorCode() == 0) {LatLng latLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));// 检查是否已经添加了当前位置的标记if (!isCurrentLocationMarkerAdded) {MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(latLng);markerOptions.title("当前位置");if (centerMarker != null) {centerMarker.setPosition(latLng);centerMarker.setTitle("当前位置");} else {centerMarker = aMap.addMarker(markerOptions);isCurrentLocationMarkerAdded = true; // 标记已添加}} else {// 如果已经添加了当前位置的标记,则只需更新其位置if (centerMarker != null) {centerMarker.setPosition(latLng);}}}} else {double latitude = viewModel.latDL.getValue();double longitude = viewModel.lngDL.getValue();LatLng latLng = new LatLng(latitude, longitude);aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));// 更新中心标记的位置和标题(如果它存在的话)if (centerMarker != null) {centerMarker.setPosition(latLng);centerMarker.setTitle(viewModel.warehouseNameLD.getValue());} else {MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(latLng);markerOptions.title(viewModel.warehouseNameLD.getValue());centerMarker = aMap.addMarker(markerOptions);}}});}
}

对应的布局文件

<?xml version="1.0" encoding="utf-8"?>
<layout><data><variablename="viewModel"type="com.ear.ams.ui.functionpage.warehousemanagement.DetailedMapViewModel" /></data><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.ear.ams.ui.functionpage.warehousemanagement.DetailedMapFragment"><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout></androidx.constraintlayout.widget.ConstraintLayout></FrameLayout>
</layout>

三、运行结果

可以在地图上选择位置并获取经纬度,在地图的中心点有一个红色的图标通过滑动图标实现位置选择。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多叉树的深度优先遍历(以电话号码的字母组合为例)
  • MySQL——数据库的操作,数据类型,表的操作
  • 卷积神经网络 - 高效的卷积算法篇
  • Ubuntu Linux安装Go语言
  • Bytebase 2.22.1 - SQL 编辑器展示更丰富的 Schema 信息
  • CVE-2017-15715~Apache解析漏洞【春秋云境靶场渗透】
  • d1.Docker 介绍和基础操作
  • Springboot集成Proguard生成混淆jar包
  • 生成式AI及其对API和软件开发的影响
  • 大数据面试SQL(五):查询最近一笔有效订单
  • 基于树莓派4B设计的智能家居控制系统(阿里云IOT)(203)
  • 【Vue】Echarts渲染数据,残留脏数据问题处理
  • k8s笔记之应用创建
  • Apache Tomcat服务器版本号隐藏
  • Qt之Gui
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • golang中接口赋值与方法集
  • JDK 6和JDK 7中的substring()方法
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python_网络编程
  • Quartz初级教程
  • spring学习第二天
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊聊redis的数据结构的应用
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 微信公众号开发小记——5.python微信红包
  • 我感觉这是史上最牛的防sql注入方法类
  • 一个SAP顾问在美国的这些年
  • 字符串匹配基础上
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​520就是要宠粉,你的心头书我买单
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #include
  • (2)空速传感器
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (补充)IDEA项目结构
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (算法二)滑动窗口
  • (转)用.Net的File控件上传文件的解决方案
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ./configure,make,make install的作用(转)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net CF下精确的计时器
  • .Net Core和.Net Standard直观理解
  • .net 程序发生了一个不可捕获的异常
  • .NET4.0并行计算技术基础(1)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net开发时的诡异问题,button的onclick事件无效
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .sh