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实现定位及定位回正相关推荐

  1. Android使用GoogleMap实现定位与路径检索功能

    本文是作者在学习使用Google Map 时的学习笔记,采用的是Kotlin语言编写. 1. Google Map定位 1.1 API KEY创建 1.1.1 手动创建 1.1.2 Android S ...

  2. Android 通过Service 实现后台GPS定位

    前言 做移动GIS开发经常会使用到定位功能,很多时候通过代码里的手写定位代码在Activity中就实现了.虽然比较简单,但是也会有一些问题,比如定位慢,代码杂乱.一直都知道可以通过Service进行后 ...

  3. android百度导航实现,Android 集成百度地图实现设备定位

    Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...

  4. android webview权限申请_Android应用开发之android 6.0下webview的定位权限设置方法

    本文将带你了解Android应用开发android 6.0下webview的定位权限设置方法,希望本文对大家学Android有所帮助. 如下所示: WebView webView =   (WebVi ...

  5. android使用高德地图SDK获取定位信息

    注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...

  6. Android:使用百度地图SDK定位当前具体位置(类似QQ发表说说的选择地点功能)

    百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口. 可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问 ...

  7. Android Native程序crash的一些定位方法简介

    Android Native程序crash的一些定位方法简介 经常,避免不了,我们的代码会崩溃.如果crash在native代码上,Android会和其他Linux一样,生成一份core dump,将 ...

  8. android开发游记:集成百度定位SDK进行实时定位 获取当前城市地理信息

    定位功能在app开发中很常用,大多数企业都是不具备定位资质的,所有一般是通过接入第三方的sdk来进行定位,比较熟悉的有如:百度.高德.谷歌.腾讯等.而国内比较地图策划比较成熟的主要是百度和高德,这里就 ...

  9. Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细介绍

    ***转载.引用请标明出处*** http://www.jianshu.com/p/29ccac3e1e42 本文出自[zhh_happig的简书博客](http://www.jianshu.com/ ...

最新文章

  1. 机器学习Python实践》——数据导入(CSV)
  2. Flink State和容错机制
  3. 支持移动端深度学习的几种开源框架
  4. iOS开发中didSelectRowAtIndexPath tap事件响应延迟
  5. Python+Appium+POM实现APP端自动化测试
  6. hibernate ——联合主键
  7. android生成aar无效,android studio生成aar包并在其他工程引用aar包的方法
  8. QT:QObject 简单介绍
  9. 解决Ubuntu “E: 软件包 vim 还没有可供安装的候选者“问题
  10. 【5分钟Paper】Fast强化学习和Slow强化学习
  11. Linux Shell常用技巧(六) sort uniq tar split
  12. 2021年最新微信漫画小程序全开源商业版免费下载
  13. DT大数据梦工厂视频资源
  14. EasyExecl导出模板,实现动态下拉列
  15. Java开发常用技术栈
  16. Juicer – 一个 JavaScript 模板引擎的实现和优化
  17. IP数据报之首部长度解析
  18. 小程序账号注册完整流程
  19. 2023服装零售erp有哪些,5款主流服装零售erp软件真实测评!
  20. python中大于0怎么表示_python怎么筛选列表中大于0的数据?

热门文章

  1. mysql 数字中文混排序
  2. 在html页面引入外部html的方法 (使用第三方插件)
  3. NLP之NLG入门理解
  4. 如何给计算机硬盘解除密码忘了,如何解除电脑硬盘密码
  5. MySQL百万级压测数据表
  6. [SV]SystemVerilog学习笔记之struct union
  7. RFID MFRC522
  8. python悬浮球窗口_悬浮窗口(智能隐藏和显示)的一种实现方案
  9. oracle 12.2R2 安装GI执行root.sh遇到CLSRSC-400
  10. 非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同