Android-- 集成谷歌地图

引言

项目需求需要在谷歌地图:

地图展示,设备点聚合,设备站点,绘制点和区域等功能。

我只针对我涉及到的技术做一下总结,希望能帮到开始接触谷歌地图的伙伴们。

集成步骤

1、在项目的modle的build.gradle中添加依赖如下:

    implementation 'com.google.android.gms:play-services-maps:12.0.1'//    地图操作工具类,添加标记等implementation 'com.google.maps.android:android-maps-utils:0.5+'

2、集成完了后,需要展示地图,这里由于谷歌地图是已经被屏蔽,需要翻墙操作才能展示。

①首先我们要注册一个谷歌账号

②使用谷歌账号登录谷歌地图开发者平台(登录网站:https://cloud.google.com/maps-platform/?hl=zh-CN),点击控制台,如图

点击控制进入控制台进行如下操作,生成谷歌地图的appkey:

点击API秘钥,生成秘钥,在生成的秘钥界面上我们点击秘钥限制,设置成android ,点击确定就生成了我们所需的appkey。

将生成的API密钥复制并粘贴到您的Android应用程序的相应位置,通常在AndroidManifest.xml中的<application>标签内,如下所示:

<application><!-- 其他配置 --><meta-dataandroid:name="com.google.android.geo.API_KEY"android:value="YOUR_GOOGLE_MAPS_API_KEY"/><!-- 其他配置 -->
</application>

替换YOUR_GOOGLE_MAPS_API_KEY为您从Google Developers Console获得的API密钥。

请注意,您需要为调试和发布版本获取不同的密钥,并为每种版本使用正确的SHA-1证书指纹。

项目开发

地图展示

 向应用中添加Google Map组件有两种基本的方式:

1、一种是利用MapFragment(Fragment的子类,内部集成GoogleMap)

2、另一种是用MapView(View的子类,内部集成GoogleMap)。

一、MapFragment

1.地图展示:分为两加载地图:

一种是在activity中动态或者是静态加载我们的谷歌地图的fragment,进行显示。

静态加载

首先说一下在activity中静态加载地图的fragment。核心代码如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/map"android:name="com.google.android.gms.maps.SupportMapFragment"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.googlemapdemo.MapsMarkerActivity" />
class MapsMarkerActivity : AppCompatActivity() , OnMapReadyCallback {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?mapFragment!!.getMapAsync(this)}override fun onMapReady(map : GoogleMap?) {}
}

这样一张谷歌地图就展示出来,显示的原因是通过mapFragment.getMapAsync()方法映射注册回调地图监听(因为谷歌地图被屏蔽了,所以需要翻墙才能看到地图,如果没有翻墙,是空白一片,并且android手机里面必须安装谷歌三件套,否则也不能显示)。

动态加载

布局:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/my_container"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.googlemapdemo.MapsMarkerActivity" />

activity 代码:

创建一个MapFragment对象,并利用FragmentTransaction动态添加到指定的容器中:

class MapsMarkerActivity : AppCompatActivity() , OnMapReadyCallback {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//        val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
//        mapFragment!!.getMapAsync(this)val fragmentManager = supportFragmentManagerval mapFragment = SupportMapFragment.newInstance()fragmentManager.beginTransaction().replace(R.id.map_container, mapFragment as Fragment ).commit()mapFragment.getMapAsync(this)}override fun onMapReady(map : GoogleMap?) {}
}

二、MapView

MapView是View的子类,只需要在布局文件中引用com.google.android.gms.maps.MapView定义一个MapView,然后在Activity初始化MapView,与普通的TextView等组件用法类似。

xml:

    //layout文件中的定义<com.google.android.gms.maps.MapViewandroid:id="@+id/mymap"android:layout_width="match_parent"android:layout_height="match_parent"/>

activity :

    //Activity中的初始化myMap = (MapView)findViewById(R.id.mymap);myMap.getMapAsync(this);//getMapAsync这个与MapFragment相同

需要特别注意的是,MapView中生命周期的方法必须与Activity生命周期的方法同步,即必须在Activity中的生命周期中调用MapView的生命周期函数。

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);```````//其他的一些初始化myMap.onCreate(savedInstanceState);}@Overrideprotected void onResume() {super.onResume();myMap.onResume();}@Overrideprotected void onPause() {super.onPause();myMap.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();myMap.onDestroy();}@Overridepublic void onLowMemory() {super.onLowMemory();myMap.onLowMemory();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);myMap.onSaveInstanceState(outState);}

onMapReady

onMapReady()是一个回调方法,用于在地图准备就绪后获取初始坐标。

当地图准备就绪时,系统会调用该方法,并传入一个GoogleMap对象作为参数,开发者可以通过该对象进行地图相关的操作。

  @Overridepublic void onMapReady(GoogleMap googleMap) {mMap = googleMap;// 获取当前位置的经纬度if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {// 请求权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);} else {// 获取到位置权限后,获取当前位置经纬度mMap.setMyLocationEnabled(true);LatLng latLng = new LatLng(mMap.getMyLocation().getLatitude(), mMap.getMyLocation().getLongitude());mMap.addMarker(new MarkerOptions().position(latLng).title("当前位置"));mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));}}

onMapReady回调中,我们首先检查定位权限,如果已经授予,我们就启用地图上的位置指示(通过调用setMyLocationEnabled(true)),然后可以获取当前的位置(通过调用getMyLocation()),并在地图上设置一个标记(通过调用addMarker())以及移动相机到当前位置(通过调用moveCamera())。如果没有定位权限,我们请求权限,并在权限被授予后执行上述操作。

三、组件的初始化

当需要初始化Map的一些状态时,可以在xml属性中设置,也可以在java代码中设置。
  

1.xml属性初始化
  
  在fragment或者MapView的xml布局中,都可以添加一些属性来初始化Map的状态。

<fragment xmlns:android="http://schemas.android.com/apk/res/android"xmlns:map="http://schemas.android.com/apk/res-auto"android:name="com.google.android.gms.maps.SupportMapFragment"android:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"map:cameraBearing="112.5"map:cameraTargetLat="-33.796923"map:cameraTargetLng="150.922433"map:cameraTilt="30"map:cameraZoom="13"map:mapType="normal"map:uiCompass="false"map:uiRotateGestures="true"map:uiScrollGestures="false"map:uiTiltGestures="true"map:uiZoomControls="false"map:uiZoomGestures="true"/>
GoogleMapOptions options = new GoogleMapOptions();
options.mapType(GoogleMap.MAP_TYPE_SATELLITE).compassEnabled(false).rotateGesturesEnabled(false).tiltGesturesEnabled(false);
//在实例化一个MapFragment对象时
MapFragment.newInstance(GoogleMapOptions options);
//或者MapView的构造函数中
MapView(Context, GoogleMapOptions)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

p19 C语言操作符详解

算术操作符 1.除了%操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。 2.对于/操作符如果两个操作数都为整数&#xff0c;执行整数除法。而只要有浮点数值型的就是浮点除法。 3.%操作符的两个操作数必须为 整数。返回的是整除之后的余数。 #include<std…

计算机毕业设计-基于Springboot的养老院管理系统-源码程序文档

项目源码&#xff0c;请关注❥点赞收藏并私信博主&#xff0c;谢谢~ 本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写&#xff0c;禁止任何人抄袭以及各类盈利性传播&#xff0c; 相关的代码部署论文ppt代码讲解答辩指导文件…

SpringBoot以及swagger的基本使用

1、SpringBoot是什么&#xff1f; 一种快速开发、启动Spring的框架、脚手架 遵循“约定优于配置”的思想&#xff0c;使得能够快速创建和配置Spring应用 2、SpringBoot的核心特性 自动配置&#xff0c;一些依赖、默认配置都预设好了&#xff0c;减少了配置量起步依赖&#x…

表格竖向展示

最近在做手机端web页面&#xff0c;页面中需要有个表格来显示数据&#xff0c;但是由于数据太多页面太窄&#xff0c;table展示横向滑动的话感觉很丑。所以让表格竖向显示了 具体页面如下: 实现代码&#xff1a;当然代码里面绑定的数据啊什么的你都可以修改为自己的内容&#…

【文献阅读】Social Bot Detection Based on Window Strategy

Abstract 机器人发帖的目的是在不同时期宣传不同的内容&#xff0c;其发帖经常会出现异常的兴趣变化、而人类发帖的目的是表达兴趣爱好和日常生活&#xff0c;其兴趣变化相对稳定。提出了一种基于窗口策略&#xff08;BotWindow Strategy&#xff09;的社交机器人检测模型基于…

【fastadmin】selectpickers多选提交后数据库只保存了一个选择值

问题描述 在 fastadmin 框架开发项目中&#xff0c;用到了selectpickers多选组件。 例如&#xff1a;选择了两位员工&#xff0c;但是提交后数据库只保存了一个选择值。 <div class"form-group"><label class"control-label col-xs-12 col-sm-2"…

Puppeteer动态代理实战:提升数据抓取效率

引言 Puppeteer是由Google Chrome团队开发的一个Node.js库&#xff0c;用于控制Chrome或Chromium浏览器。它提供了高级API&#xff0c;可以进行网页自动化操作&#xff0c;包括导航、屏幕截图、生成PDF、捕获网络活动等。在本文中&#xff0c;我们将重点介绍如何使用Puppeteer…

【深度学习】InternVL2-8B,图转文,docker部署

文章目录 基础fastapi服务请求fastapi接口 基础 https://huggingface.co/OpenGVLab/InternVL2-8B#%E7%AE%80%E4%BB%8B InternVL2-26B应该更好&#xff0c;但显存没那么大&#xff0c;只能跑InternVL2-8B了。 下载&#xff1a; cd /ssd/xiedong/InternVL2-26B git clone htt…

unity3d脚本使用start,updata,awake

最近学了一下unity&#xff0c;脚本编写用的c#&#xff0c;虽说没学过c#但是勉强根据教学还能写点代码。 在这里我来记录一下在我学习过程中感觉最重要的东西 消息函数&#xff1a; 在我们创建一个脚本文件的时候&#xff0c;我们首先可以看到两个默认给你写出来的函数。 这两…

RAG技术-为自然语言处理注入新动力

引言&#xff1a; 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术以其独特的方式&#xff0c;正在改变我们与机器的交互方式。RAG技术结合了大语言模型的强大能力&#xff0c;使得机器在理解和…

MongoDB教程(九):java集成mongoDB

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、环境准…

SAPUI5基础知识15 - 理解控件的本质

1. 背景 经过一系列的练习&#xff0c;通过不同的SAPUI5控件&#xff0c;我们完成了对应用程序界面的初步设计&#xff0c;在本篇博客中&#xff0c;让我们一起总结下SAPUI5控件的相关知识点&#xff0c;更深入地理解SAPUI5控件的本质。 通常而言&#xff0c;一个典型UI5应用…

RocketMQ单结点安装/Dashboard安装

目录 1.安装NameServer 2.安装Broker 3.使用自带工具测试数据发送 4.使用DashBoard进行查看 5.关闭相关设备 前置条件&#xff1a;两台虚拟机CentOS Linux release 7.5.1804(ps:当然也可以都部署在一台机器上) RocketMq属于天生集群。需要同时启动nameServer和Broker进行…

CMMI认证是什么?做CMMI认证的必要条件?CMMI认证的重要性

CMMI&#xff08;Capability Maturity Model Integration&#xff09;认证&#xff0c;作为企业追求卓越软件工程实践的标志&#xff0c;其实现过程既严谨又复杂。首先&#xff0c;我们需要深入理解CMMI的核心理念&#xff0c;即持续的过程改进和成熟度提升。 为了实现CMMI认证…

C++ 几何计算库

代码 #include <iostream> #include <list> #include <CGAL/Simple_cartesian.h> #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_segment_primitive.h> #include <CGAL/Polygon_2.h>typedef CGAL…

线性代数|机器学习-P24加速梯度下降(动量法)

文章目录 1. 概述2. 引入3. 动量法梯度下降 1. 概述 我们之前学的最速梯度下降[线搜索方法] 公式如下&#xff1a; x k 1 x k − s k ∇ f ( x k ) \begin{equation} x_{k1}x_k-s_k\nabla f(x_k) \end{equation} xk1​xk​−sk​∇f(xk​)​​ 但对于这种方法来说&#xff…

助力数据记录:Connext的Historian功能启动指南

​ 在工业自动化领域&#xff0c;Connext以其全新的OPCUA数据采集解决方案为核心&#xff0c;不仅拥有超越传统的扩展功能&#xff0c;而且在多个行业中都得到了广泛的认证。Connext能够快速找出解决方案并迅速部署&#xff0c;整个过程不会影响到原有的生产。它的强大之处在于…

信创学习笔记(三),信创之操作系统OS思维导图

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” 一. 回顾信创CPU芯片 1. x86应用生态最丰富, 海光(3,5,7)授权较新,无桌面授权,多用于服务器 兆芯(ZX, KX, KH)授权较早期. 2. ARMv8移动端应用生态丰富, 华为鲲鹏(9) ,制裁中&#xff0c;…

基于python的三次样条插值原理及代码

1 三次样条插值 1.1 三次样条插值的基本概念 三次样条插值是通过求解三弯矩方程组&#xff08;即三次样条方程组的特殊形式&#xff09;来得出曲线函数组的过程。在实际计算中&#xff0c;还需要引入边界条件来完成计算。样条插值的名称来源于早期工程师制图时使用的细长木条&…