Android接入google地图

  • 创建谷歌云结算账户

1.注册一个Google 帐号

2.需要一个可以美元扣款的信用卡

3.登录Google帐号,访问Google Cloud谷歌云的网站 cloud.google.com,之后点击蓝色按钮 免费开始使用,按提示注册即可。

示例源代码:

git@github.com:sueleeyu/android-maps.git

二、控制台创建Project

1.进入谷歌云控制台,创建项目:

https://console.cloud.google.com/projectselector2/home/dashboard

2.创建凭证:选择创建的项目,点击左上角图标,创建该项目凭据

3.输入包名和证书指纹

在android studio控制台输入:

keytool -list -printcert -jarfile F:\...\app-release.apk  //apk位置

可以获取指纹

4.选择api库

5.选择android sdk

6.启用:

三、创建android studio项目

1.新建空白android工程

2.添加google play service:File-Setting-Google Play service。

3.在app的build.gradle的dependencies添加:

implementation 'com.google.android.gms:play-services-maps:18.0.2'

implementation 'com.google.android.gms:play-services-location:19.0.1'

4.strings.xml中添加谷歌云控制台生成的appKey:

<string name="google_map_key">AIzaSyBY…gLc</string>

5.在AndroidManifest.xml中添加meta-data:
<meta-dataandroid:name="com.google.android.geo.API_KEY"android:value="@string/google_map_key" /><meta-dataandroid:name="com.google.android.gms.version"android:value="@integer/google_play_services_version" />

6. 在AndroidManifest.xml中添加权限:

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

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

7.添加如下fragment到activity_main.xml,运行demo。

<fragment

android:id="@+id/mapview"

class="com.google.android.gms.maps.SupportMapFragment"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

四、定位功能接入

1.MainActivity实现OnMapReadyCallback接口
2. onCreate中添加代码getMapAsync
3. onMapReady回调中动态申请权限,然后调用定位,显示地图
package com.suelee.mapsimport android.Manifestimport android.annotation.SuppressLintimport android.content.pm.PackageManagerimport android.location.Locationimport android.os.Buildimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.os.Looperimport android.util.Logimport androidx.core.app.ActivityCompatimport androidx.core.content.ContextCompatimport com.google.android.gms.location.*import com.google.android.gms.maps.CameraUpdateFactoryimport com.google.android.gms.maps.GoogleMapimport com.google.android.gms.maps.OnMapReadyCallbackimport com.google.android.gms.maps.SupportMapFragmentimport com.google.android.gms.maps.model.*class MainActivity : AppCompatActivity(), OnMapReadyCallback {//定位clientprivate lateinit var fusedLocationProviderClient: FusedLocationProviderClientprivate var map:GoogleMap? = nullprivate var currentLocation : Location? = null//当前定位markerprivate var currentMarker: Marker? = nullval REQUEST_PHOTO_CODE = 3002 //获取权限override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main);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_HYBRIDval permission = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION)requestPermission(permission, REQUEST_PHOTO_CODE)googleMap.isIndoorEnabled = true}@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).title("Marker")//.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()}///----------/*** 动态获权* *//*** 动态获权请求值*/private var REQUEST_CODE_PERMISSION = 0x00099protected val TAG = this.javaClass.simpleName/*** 请求权限* 动态获权* @param permissions 请求的权限* @param requestCode 请求权限的请求码*/open fun requestPermission(permissions: Array<String>,requestCode: Int) {REQUEST_CODE_PERMISSION = requestCodeif (checkPermissions(permissions)) {permissionSuccess(REQUEST_CODE_PERMISSION)} else {try {val needPermissions =getDeniedPermissions(permissions)ActivityCompat.requestPermissions(this,needPermissions.toTypedArray(),REQUEST_CODE_PERMISSION)} catch (e: Exception) {Log.e("BaseActivity", "获取权限失败 Exception = $e")}}}/*** 检测所有的权限是否都已授权*/fun checkPermissions(permissions: Array<String>): Boolean {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {return true}for (permission in permissions) {if (ContextCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED) {return false}}return true}/*** 获取权限集中需要申请权限的列表*/fun getDeniedPermissions(permissions: Array<String>): List<String> {val needRequestPermissionList: MutableList<String> =ArrayList()for (permission in permissions) {if (ContextCompat.checkSelfPermission(this, permission) !=PackageManager.PERMISSION_GRANTED ||ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {needRequestPermissionList.add(permission)}}return needRequestPermissionList}/*** 系统请求权限回调*/override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<String?>,grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)if (requestCode == REQUEST_CODE_PERMISSION) {if (verifyPermissions(grantResults)) {permissionSuccess(REQUEST_CODE_PERMISSION)} else {permissionFail(REQUEST_CODE_PERMISSION)}}}/*** 确认所有的权限是否都已授权*/fun verifyPermissions(grantResults: IntArray): Boolean {for (grantResult in grantResults) {if (grantResult != PackageManager.PERMISSION_GRANTED) {return false}}return true}/*** 获取权限成功*/open fun permissionSuccess(requestCode: Int) {Log.e(TAG, "获取权限成功=$requestCode")startLocationUpdates()}/*** 权限获取失败*/open fun permissionFail(requestCode: Int) {Log.e(TAG, "获取权限失败=$requestCode")}}
4.运行,真机需要安装google 服务才可以,国内手机基本不行。

五、常见问题

1.manifest merger faild:Apps targeting Android 12 and higher are required to specify an explicit…
解决:根据提示在AndroidManifest.xml文件中给activity添加: android:exported="true"

六、参考文献

1. Google官方文档:

https://developers.google.com/maps/documentation/android-api/map?hl=zh-cn

2. Google官方文档

https://developers.google.com/maps/documentation/android-sdk/config?hl=zh-cn

3. Android使用GoogleMap实现定位及定位回正_Tobey_r1的博客-CSDN博客_google map 定位

4. https://blog.51cto.com/u_15360378/3808483

5. 示例源代码:

git@github.com:sueleeyu/android-maps.git

Android接入google地图相关推荐

  1. Android的Google地图开发

    编写这个程序之前需要有一个Google 地图 扩展库在SDK中,一般来说,android 1.5中就已经有了.如果没有的话可以在这里下载: http://code.google.com/android ...

  2. android 添加ga_android开发步步为营之70:android接入Google Analytics总结

    求人不如求己,今天项目里要接入Google Analytics,这个是做应用统计分析用的,可以查看当前手机活跃用户,事件点击等等数据,先看看效果: 之前eclipse里面接入已经成功,昨天项目组决定项 ...

  3. 项目记录——为沙特客户Android开发Google地图应用

    最近在给沙特客户所做的应用中需要用到地图,所以原来常用的百度地图就不能使用了,只好换成了Google地图.结果在开发过程中遇到了很多坑,折腾了不少时间终于搞定.这里特记录下之中的几个要点,让同学们有个 ...

  4. android开发google地图

    最近学习android的开发,在学习google地图开发的时候遇见一些问题,在此特地记录一下开发学习的步骤,也希望能帮助和我一样遇见问题的朋友.因为市面上的很多学习视频和博客 文章对这个的介绍很多都是 ...

  5. Android接入高德地图SDK,Android高德SDK 地图篇一:集成高德SDK

    Android高德SDK 地图篇一:集成高德SDK 大家好,这是系列博文的第一篇: 系列博文会完成以下功能 一. 地图篇:利用高德SDK实现滴滴出行的效 二. 导航篇:利用高德SDK实现滴滴司机端的效 ...

  6. android 接入百度地图sdk

    项目需求: 接入地图 定位位置 设置百度地图上的各种图标 加载方格的问题 接入地图 1.创建应用 接入的是百度地图,首先去百度地图开放平台上添加应用.在http://lbsyun.baidu.com/ ...

  7. Android接入高德地图SDK 一引入高德sdk

    SHA1的获取: 然后输入cd .android 回车 在输入:keytool -list -v -keystore debug.keystore 在回车,密钥默认 android 添加 jar 文件 ...

  8. cocos creator Android 接入Google登陆sdk

    准备工作 这里就不详细介绍,主要说一下客户端sdk接入 1.手机上安装Google服务 2.一个绑定信用卡的Google账号: 3.Google play客户端: 4..Google Play开发者后 ...

  9. cocos creator Android 接入Google支付sdk

    准备工作 1.手机上安装Google服务 2.一个绑定信用卡的Google账号: 3.Google play客户端: 4..Google Play开发者后台创建应用 5.科学上网的工具 -等等 这些就 ...

  10. android 加载谷歌地图,Android调用google地图生成路线图实现代码

    Android程序调用本机googlemap,传递起始和终点位置,生成路线图 if (wodeweizhiPoint != null) { if (wodeweizhiPoint.getLatitud ...

最新文章

  1. 批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能
  2. mysql主从(GTID复制模式)
  3. 博士在淘宝“扫垃圾”
  4. Ubuntu14.04 kylin 安装配置Tomcat7服务器
  5. flink实时机器学习-alink在线机器学习remote模式贝叶斯建模实验记录
  6. 160 - 16 bjanes.2
  7. 详解经典GPS辅助惯性导航论文 A GPS-aided Inertial Navigation System in Direct Configuration
  8. arm 基于qcamera实现_基于Arm平台的研华EPC—R4680工控机实现快速储物柜智能解决方案...
  9. Modelsim仿真教程
  10. vb datagrid mysql_vb ADO 连接数据库,并绑定datagrid控件
  11. 大型分布式电商系统架构技术总结
  12. iOS SwiftUI ☞ UIKit框架的封装使用
  13. Ubuntu连接WiFi开热点
  14. c(RGDyC),cyclo(Arg-Gly-Asp-D-Tyr-Cys),环状RGD多肽系列
  15. 突变瀑布图及亚型突变瀑布
  16. WCF基础教程(三)——WCF通信过程及配置文件解析
  17. 重温Python基础——字符串
  18. java面试宝典2013
  19. redis实战第七篇 使用redis工具(redis-cli)搭建redis cluster
  20. [转]什么是Base-64编码?

热门文章

  1. MFC 对话框常用控件详解
  2. python读取图片并显示
  3. android 中通过SimpleDateFormat自定义显示英文的时间格式
  4. 论文阅读笔记:内卷involution《Involution: Inverting the Inherence of Convolution for Visual Recognition》
  5. 别说你不知道光纤有这七种类型!
  6. 蓝桥杯第十二届省赛JAVA C组 试题 F: 时间显示
  7. 冬奥幕后故事:从低碳火炬到AI裁判,十四年后中国科技再上场
  8. 单片机实验六 动态数码管实验
  9. transformer中的多头注意力机制
  10. Python接口自动化