Android使用GoogleMap实现定位及定位回正
Android使用GoogleMap实现定位及定位回正
- 关于:
- 效果图
- 配置
- 在Android studio添加对应配置
- 开始使用
- 实现定位及定位移动方向
- 文末
关于:
本篇内容主要介绍如何使用GoogleMap定位当前设备位置以及定位marker的实时方向
官方Map for Android SDK使用文档
效果图
定位效果:
地图归正效果图(5Mb的gif太难搞了,所以画面失真很严重,看个大概就好了):
配置
首先要去谷歌地图平台点击开始Get started创建一个新项目:
新建项目:
然后选择左侧API与服务点击库按钮,选择Maps SDK for Android:
然后在进入的新的页面选择启用api:
回到项目,选择左侧 API与服务 然后点击 凭据 按钮,在点击新建凭据,选择API密钥:
这里我生产的api密钥是未加限制的(谁都可以访问,正式开发的时候要根据需要添加类似Android应用的限制)
在Android studio添加对应配置
项目的build文件里添加如下:
//maps//好像这个playservice和map使用需要target指定31+,还有min的制定implementation 'com.google.android.gms:play-services-maps:18.0.2'implementation 'com.google.android.gms:play-services-location:19.0.1'
修改Androidmanifest.xml文件:
添加定位权限申请:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
添加map的私钥以及pay service版本:
<meta-dataandroid:name="com.google.android.geo.API_KEY"android:value="${your map key}" /><meta-dataandroid:name="com.google.android.gms.version"android:value="@integer/google_play_services_version" />
开始使用
第一步,创建一个空白activity,并修改布局(activity_google_maps.xml):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"tools:context=".GoogleMapsActivity"><fragmentandroid:layout_width="match_parent"android:layout_height="match_parent"android:name="com.google.android.gms.maps.SupportMapFragment"android:id="@+id/map"/></androidx.constraintlayout.widget.ConstraintLayout>
修改GoogleMapsActivity文件如下:
class GoogleMapsActivity : AppCompatActivity(), OnMapReadyCallback {//viewbindingprivate lateinit var binding: ActivityGoogleMapsBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityGoogleMapsBinding.inflate(layoutInflater)setContentView(binding.root)val mapFragment : SupportMapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragmentmapFragment.getMapAsync(this)}@SuppressLint("MissingPermission")override fun onMapReady(googleMap: GoogleMap) {map = googleMapgoogleMap.mapType = GoogleMap.MAP_TYPE_HYBRID //地图模式为混合,权限请求参考Activity Result APIpercheckRegister.requestPermissions(arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.ACCESS_COARSE_LOCATION)){//请求定位权限if (it){}}}
}
此时如果上面配置一切正常的话,效果如下:
实现定位及定位移动方向
这里我也直接贴代码了,修改如下:
class GoogleMapsActivity : AppCompatActivity(), OnMapReadyCallback {private lateinit var binding: ActivityGoogleMapsBinding//定位clientprivate lateinit var fusedLocationProviderClient: FusedLocationProviderClientprivate var map:GoogleMap? = nullprivate var currentLocation : Location? = null//当前定位marker点private var currentMarker: Marker? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityGoogleMapsBinding.inflate(layoutInflater)setContentView(binding.root)fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)val mapFragment : SupportMapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragmentmapFragment.getMapAsync(this)}@SuppressLint("MissingPermission")override fun onMapReady(googleMap: GoogleMap) {map = googleMapgoogleMap.mapType = GoogleMap.MAP_TYPE_HYBRIDpercheckRegister.requestPermissions(arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.ACCESS_COARSE_LOCATION)){if (it){googleMap.isIndoorEnabled = true //不影响startLocationUpdates()}}}@SuppressLint("MissingPermission")private fun startLocationUpdates(){fusedLocationProviderClient.requestLocationUpdates(LocationRequest.create().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)//设置高精度.setInterval(3000), //3秒一次定位请求locationCallback,Looper.getMainLooper())}//定位回调private val locationCallback = object : LocationCallback(){override fun onLocationResult(locationResult: LocationResult) {for (location in locationResult.locations){drawLocationMarker(location,LatLng(location.latitude,location.longitude))}}}@SuppressLint("NewApi")private fun drawLocationMarker(location: Location, latLng: LatLng) {if (currentLocation == null){//第一次定位画定位markercurrentMarker = map?.addMarker(MarkerOptions().position( latLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_vehicle_location)))map?.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,14f))}else{val deltaTime = location.time - currentLocation!!.time//有方位精度if (location.hasBearingAccuracy()){if (deltaTime <= 0){map?.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.Builder().target(latLng).zoom(map?.cameraPosition!!.zoom).bearing(location.bearing).build()))}else{map?.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.Builder().target(latLng).zoom(map?.cameraPosition!!.zoom).bearing(location.bearing).build()), deltaTime.toInt(),null)}currentMarker?.rotation = 0f}else{if (deltaTime <= 0){map?.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,map?.cameraPosition!!.zoom))}else{map?.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,map?.cameraPosition!!.zoom), deltaTime.toInt(), null)}//设置marker的指针方向currentMarker?.rotation = location.bearing - (map?.cameraPosition?.bearing ?:0f)}}currentLocation = location}private fun stopLocationUpdates(){fusedLocationProviderClient.removeLocationUpdates(locationCallback)}override fun onDestroy() {super.onDestroy()stopLocationUpdates()}
}
文末
到此本篇结束,有问题欢迎批评指正,觉得不错的也请点个赞,谢谢
Android使用GoogleMap实现定位及定位回正相关推荐
- Android使用GoogleMap实现定位与路径检索功能
本文是作者在学习使用Google Map 时的学习笔记,采用的是Kotlin语言编写. 1. Google Map定位 1.1 API KEY创建 1.1.1 手动创建 1.1.2 Android S ...
- Android 通过Service 实现后台GPS定位
前言 做移动GIS开发经常会使用到定位功能,很多时候通过代码里的手写定位代码在Activity中就实现了.虽然比较简单,但是也会有一些问题,比如定位慢,代码杂乱.一直都知道可以通过Service进行后 ...
- android百度导航实现,Android 集成百度地图实现设备定位
Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...
- android webview权限申请_Android应用开发之android 6.0下webview的定位权限设置方法
本文将带你了解Android应用开发android 6.0下webview的定位权限设置方法,希望本文对大家学Android有所帮助. 如下所示: WebView webView = (WebVi ...
- android使用高德地图SDK获取定位信息
注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...
- Android:使用百度地图SDK定位当前具体位置(类似QQ发表说说的选择地点功能)
百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口. 可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问 ...
- Android Native程序crash的一些定位方法简介
Android Native程序crash的一些定位方法简介 经常,避免不了,我们的代码会崩溃.如果crash在native代码上,Android会和其他Linux一样,生成一份core dump,将 ...
- android开发游记:集成百度定位SDK进行实时定位 获取当前城市地理信息
定位功能在app开发中很常用,大多数企业都是不具备定位资质的,所有一般是通过接入第三方的sdk来进行定位,比较熟悉的有如:百度.高德.谷歌.腾讯等.而国内比较地图策划比较成熟的主要是百度和高德,这里就 ...
- Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细介绍
***转载.引用请标明出处*** http://www.jianshu.com/p/29ccac3e1e42 本文出自[zhh_happig的简书博客](http://www.jianshu.com/ ...
最新文章
- 机器学习Python实践》——数据导入(CSV)
- Flink State和容错机制
- 支持移动端深度学习的几种开源框架
- iOS开发中didSelectRowAtIndexPath tap事件响应延迟
- Python+Appium+POM实现APP端自动化测试
- hibernate ——联合主键
- android生成aar无效,android studio生成aar包并在其他工程引用aar包的方法
- QT:QObject 简单介绍
- 解决Ubuntu “E: 软件包 vim 还没有可供安装的候选者“问题
- 【5分钟Paper】Fast强化学习和Slow强化学习
- Linux Shell常用技巧(六) sort uniq tar split
- 2021年最新微信漫画小程序全开源商业版免费下载
- DT大数据梦工厂视频资源
- EasyExecl导出模板,实现动态下拉列
- Java开发常用技术栈
- Juicer – 一个 JavaScript 模板引擎的实现和优化
- IP数据报之首部长度解析
- 小程序账号注册完整流程
- 2023服装零售erp有哪些,5款主流服装零售erp软件真实测评!
- python中大于0怎么表示_python怎么筛选列表中大于0的数据?
热门文章
- mysql 数字中文混排序
- 在html页面引入外部html的方法 (使用第三方插件)
- NLP之NLG入门理解
- 如何给计算机硬盘解除密码忘了,如何解除电脑硬盘密码
- MySQL百万级压测数据表
- [SV]SystemVerilog学习笔记之struct union
- RFID MFRC522
- python悬浮球窗口_悬浮窗口(智能隐藏和显示)的一种实现方案
- oracle 12.2R2 安装GI执行root.sh遇到CLSRSC-400
- 非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同