Android接入google地图
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//当前定位marker点private 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地图相关推荐
- Android的Google地图开发
编写这个程序之前需要有一个Google 地图 扩展库在SDK中,一般来说,android 1.5中就已经有了.如果没有的话可以在这里下载: http://code.google.com/android ...
- android 添加ga_android开发步步为营之70:android接入Google Analytics总结
求人不如求己,今天项目里要接入Google Analytics,这个是做应用统计分析用的,可以查看当前手机活跃用户,事件点击等等数据,先看看效果: 之前eclipse里面接入已经成功,昨天项目组决定项 ...
- 项目记录——为沙特客户Android开发Google地图应用
最近在给沙特客户所做的应用中需要用到地图,所以原来常用的百度地图就不能使用了,只好换成了Google地图.结果在开发过程中遇到了很多坑,折腾了不少时间终于搞定.这里特记录下之中的几个要点,让同学们有个 ...
- android开发google地图
最近学习android的开发,在学习google地图开发的时候遇见一些问题,在此特地记录一下开发学习的步骤,也希望能帮助和我一样遇见问题的朋友.因为市面上的很多学习视频和博客 文章对这个的介绍很多都是 ...
- Android接入高德地图SDK,Android高德SDK 地图篇一:集成高德SDK
Android高德SDK 地图篇一:集成高德SDK 大家好,这是系列博文的第一篇: 系列博文会完成以下功能 一. 地图篇:利用高德SDK实现滴滴出行的效 二. 导航篇:利用高德SDK实现滴滴司机端的效 ...
- android 接入百度地图sdk
项目需求: 接入地图 定位位置 设置百度地图上的各种图标 加载方格的问题 接入地图 1.创建应用 接入的是百度地图,首先去百度地图开放平台上添加应用.在http://lbsyun.baidu.com/ ...
- Android接入高德地图SDK 一引入高德sdk
SHA1的获取: 然后输入cd .android 回车 在输入:keytool -list -v -keystore debug.keystore 在回车,密钥默认 android 添加 jar 文件 ...
- cocos creator Android 接入Google登陆sdk
准备工作 这里就不详细介绍,主要说一下客户端sdk接入 1.手机上安装Google服务 2.一个绑定信用卡的Google账号: 3.Google play客户端: 4..Google Play开发者后 ...
- cocos creator Android 接入Google支付sdk
准备工作 1.手机上安装Google服务 2.一个绑定信用卡的Google账号: 3.Google play客户端: 4..Google Play开发者后台创建应用 5.科学上网的工具 -等等 这些就 ...
- android 加载谷歌地图,Android调用google地图生成路线图实现代码
Android程序调用本机googlemap,传递起始和终点位置,生成路线图 if (wodeweizhiPoint != null) { if (wodeweizhiPoint.getLatitud ...
最新文章
- 批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能
- mysql主从(GTID复制模式)
- 博士在淘宝“扫垃圾”
- Ubuntu14.04 kylin 安装配置Tomcat7服务器
- flink实时机器学习-alink在线机器学习remote模式贝叶斯建模实验记录
- 160 - 16 bjanes.2
- 详解经典GPS辅助惯性导航论文 A GPS-aided Inertial Navigation System in Direct Configuration
- arm 基于qcamera实现_基于Arm平台的研华EPC—R4680工控机实现快速储物柜智能解决方案...
- Modelsim仿真教程
- vb datagrid mysql_vb ADO 连接数据库,并绑定datagrid控件
- 大型分布式电商系统架构技术总结
- iOS SwiftUI ☞ UIKit框架的封装使用
- Ubuntu连接WiFi开热点
- c(RGDyC),cyclo(Arg-Gly-Asp-D-Tyr-Cys),环状RGD多肽系列
- 突变瀑布图及亚型突变瀑布
- WCF基础教程(三)——WCF通信过程及配置文件解析
- 重温Python基础——字符串
- java面试宝典2013
- redis实战第七篇 使用redis工具(redis-cli)搭建redis cluster
- [转]什么是Base-64编码?