安卓 Google Maps 的使用和開發步驟

文章目錄

  • 1. main
  • 2. Android 谷歌地圖
  • 3. 源碼
  • Reference

1. main

在國內選擇的SDK可以是高德、百度、騰訊、xxxx等,但在國外,你首選是谷歌,因此要進行Google地圖的開發你首先要解決下面三個問題

VPN
Google賬號
信用卡American Express(美國運通卡)Discover(美國發現卡)JCB(Japan Credit Bureau,日本國際信用卡)MasterCard(萬事達)VISA(維薩)

2. Android 谷歌地圖

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

    一、設置Google Cloud 項目二、項目配置① 設置SDK② 配置API密鑰③ 配置AndroidManifest.xml三、添加地圖四、定位當前① 請求定位權限② 我的位置控件③ 獲取當前位置五、配置地圖① xml配置地圖② 代碼配置地圖③ 地圖點擊事件④ 管理Marker六、地址位置編碼① 坐標轉地址② 地址轉坐標七、源碼

3. 源碼

這里zhi貼上GoogleMapActivity的完整代碼:

@SuppressLint("NewApi")
class GoogleMapActivity : AppCompatActivity(), OnMapReadyCallback, Geocoder.GeocodeListener {private lateinit var binding: ActivityGoogleMapBinding// 地圖private lateinit var map: GoogleMap// Places API 的入口點。private lateinit var placesClient: PlacesClient// 融合位置信息提供程序的入口點。private lateinit var fusedLocationProviderClient: FusedLocationProviderClient// 最后已知位置private var lastKnownLocation: Location? = null// 標記private var marker: Marker? = null// 地理編碼器private var geocoder: Geocoder? = null// 地址結果private var addressesLiveData: MutableLiveData<List<Address>> = MutableLiveData()companion object {private val TAG = GoogleMapActivity::class.java.simpleName// 默認縮放private const val DEFAULT_ZOOM = 15// 權限請求碼private const val LOCATION_PERMISSION_REQUEST_CODE = 9527// 未授予位置權限時使用的默認位置(澳大利亞悉尼)和默認縮放。private val defaultLocation = LatLng(-33.8523341, 151.2106085)}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()binding = ActivityGoogleMapBinding.inflate(layoutInflater)setContentView(binding.root)ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}initView()}/*** 初始化視圖*/private fun initView() {// 構造 PlacesClientPlaces.initialize(applicationContext, BuildConfig.MAPS_API_KEY)placesClient = Places.createClient(this)// 構造 FusedLocationProviderClient。fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragmentmapFragment.getMapAsync(this)}/*** 檢查權限*/private fun checkPermission() {// 檢查當前是否擁有精確位置或粗略位置權限if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {// 權限已授予,可以進行定位操作Log.d(TAG, "checkPermission: 權限已授予")configMap()} else {Log.d(TAG, "checkPermission: 請求權限")// 請求權限ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION),LOCATION_PERMISSION_REQUEST_CODE)}}/*** 地圖就緒*/override fun onMapReady(googleMap: GoogleMap) {map = googleMap// 檢查權限checkPermission()}/*** 地圖配置*/@SuppressLint("MissingPermission")private fun configMap() {Log.d(TAG, "configMap: 地圖配置")// 初始化地理編碼器geocoder = Geocoder(this)// 編碼結果addressesLiveData.observe(this) { addresses ->// 獲取地址信息if (!addresses.isNullOrEmpty()) {val address = addresses[0]Log.d(TAG, "Address: ${address.latitude} ${address.longitude} ${address.countryName} ${address.adminArea} ${address.locality} ${address.thoroughfare} ${address.subThoroughfare}")}}map.apply {isMyLocationEnabled = true // 地圖上啟用“我的位置”圖層// 當前位置圖標的點擊事件setOnMyLocationButtonClickListener {Log.d(TAG, "configMap: 點擊位置圖標")// 移除標點marker?.remove()marker = nullreturn@setOnMyLocationButtonClickListener false}// 定位后的藍點點擊事件setOnMyLocationClickListener { location ->Log.d(TAG, "configMap: 點擊我的位置 $location")Toast.makeText(this@GoogleMapActivity, "Current location:\n$location", Toast.LENGTH_LONG).show()}// 地圖點擊事件setOnMapClickListener { latLng ->changeMapCenter(latLng)}// 地圖設置uiSettings.apply {isZoomControlsEnabled = true // 顯示縮放按鈕isMyLocationButtonEnabled = true // 顯示定位按鈕isCompassEnabled = true // 顯示指南針isMapToolbarEnabled = true // 顯示地圖工具欄isRotateGesturesEnabled = true // 允許旋轉手勢isScrollGesturesEnabled = true // 允許滾動手勢isTiltGesturesEnabled = true // 允許傾斜手勢isZoomGesturesEnabled = true // 允許縮放手勢isScrollGesturesEnabledDuringRotateOrZoom = true // 允許在旋轉或縮放時滾動手勢isIndoorLevelPickerEnabled = true // 顯示室內層選擇器}}// 獲取當前位置getCurrentLocation()}/*** 獲取當前位置*/@SuppressLint("MissingPermission")private fun getCurrentLocation() {Log.d(TAG, "getCurrentLocation: 獲取當前位置")fusedLocationProviderClient.lastLocation.addOnCompleteListener { task ->// 獲取當前位置未成功if (!task.isSuccessful) {Log.d(TAG, "Current location is null. Using defaults.")Log.e(TAG, "Exception: %s", task.exception)// 設置默認位置changeMapCenter(defaultLocation)return@addOnCompleteListener}lastKnownLocation = task.resultif (lastKnownLocation == null) return@addOnCompleteListener// 移動地圖到當前位置changeMapCenter(LatLng(lastKnownLocation!!.latitude, lastKnownLocation!!.longitude))}}/*** 改變地圖中心*/private fun changeMapCenter(latLng: LatLng) {// 移除標點marker?.remove()// 添加標點marker = map.addMarker(MarkerOptions().title("Marker") // 設置標題.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_google)) // 設置自定義圖標.alpha(0.7f) // 設置透明度.position(latLng) // 設置位置)// 獲取詳細位置信息// getDetailAddress(latLng)// 獲取默認經緯度的地址信息getDetailLatLng()// 地圖中移動到經緯度處map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, DEFAULT_ZOOM.toFloat()))}/*** 獲取默認經緯度的地址信息*/private fun getDetailLatLng(address: String = "悉尼歌劇院") {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {geocoder?.getFromLocationName(address, 1, this@GoogleMapActivity)} else {addressesLiveData.postValue(geocoder?.getFromLocationName(address, 1))}}/*** 獲取詳情位置信息,獲取國內位置會出現異常*/private fun getDetailAddress(latLng: LatLng) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {geocoder?.getFromLocation(latLng.latitude, latLng.longitude, 1, this@GoogleMapActivity)} else {addressesLiveData.postValue(geocoder?.getFromLocation(latLng.latitude, latLng.longitude, 1))}}/*** 權限請求結果*/override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when (requestCode) {LOCATION_PERMISSION_REQUEST_CODE -> {// 如果請求被取消,則結果數組為空if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 權限被授予,可以進行定位操作Log.d(TAG, "onRequestPermissionsResult: 權限被授予")configMap()} else {// 權限被拒絕,無法進行定位操作Log.d(TAG, "onRequestPermissionsResult: 權限被拒絕")Toast.makeText(this, "拒絕將無法使用定位功能", Toast.LENGTH_SHORT).show()finish()}}}}/*** 地理編碼結果,經緯度坐標轉地址*/override fun onGeocode(addresses: MutableList<Address>) {addressesLiveData.postValue(addresses)}
}

Reference

https://blog.csdn.net/qq_38436214/article/details/140985527

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97817.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97817.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux -- 應用層協議Http

1.HTTP背景知識 HTTP協議&#xff1a;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;的本質是運行在 TCP/IP 協議族之上的 “應用層協議”&#xff0c;核心作用是定義客戶端&#xff08;如瀏覽器、APP&#xff09;與服務器之間的 “數據…

R 語言本身并不直接支持 Python 中 f“{series_matrix}.txt“ 這樣的字符串字面量格式化(f-string)語法 glue函數

R 語言本身并不直接支持 Python 中 f"{series_matrix}.txt" 這樣的字符串字面量格式化&#xff08;f-string&#xff09;語法。 在 R 中&#xff0c;要實現字符串拼接或格式化&#xff0c;你需要使用其他方法。下表對比了 Python f-string 和 R 中常見對應方法的主要…

【AI智能體】亮數據MCP Server × Dify:AI智能體獲取實時影音數據就是這么簡單

文章目錄一、引言&#xff1a;AI 應用與實時影音數據的融合價值1、傳統采集方式的痛點2、MCP Server 的創新價值二、亮數據 MCP Server 概覽1、什么是 MCP Server&#xff1f;2、支持的影音平臺和API接口3、產品特色亮點三、業務場景示例設計1、選定場景&#xff1a;競品分析與…

從《Attention Is All You Need》深入理解Transformer

2017年的《Attention Is All You Need》論文提出的Transformer架構&#xff0c;不僅徹底改變了自然語言處理的格局&#xff0c;更為現代人工智能的發展奠定了堅實基礎。本文將帶你深入解析這一劃時代模型的核心思想、技術細節及其深遠影響。&#x1f504; 一、背景與動機&#…

【08】AI輔助編程完整的安卓二次商業實戰-修改消息聊天框背景色-觸發聊天讓程序異常終止bug牽涉更多聊天消息發送優化處理-優雅草卓伊凡

【08】AI輔助編程完整的安卓二次商業實戰-修改消息聊天框背景色-觸發聊天讓程序異常終止bug牽涉更多聊天消息發送優化處理-優雅草卓伊凡引言本次二開布局沒有變&#xff0c;但是下一次整體布局會有變&#xff0c;不過本次開發發現朋友圈跳轉功能的流程步驟也做了一定的變化。原…

心理調適與情緒管理實訓室:支撐康養旅游人才心理能力培養

在康養休閑旅游服務專業的教學體系中&#xff0c;心理調適與情緒管理實訓室作為關鍵教學場所&#xff0c;承擔著培養學生心理服務能力、情緒疏導技能和人際溝通素養的重要任務。隨著社會對康養旅游服務質量要求的提升&#xff0c;具備心理調適與情緒管理能力的專業人才日益受到…

Oracle sql tuning guide 翻譯 Part 6 --- 優化器控制

第五部分優化器控制你可以用提示信息和初始化參數來影響優化器的判斷和運作方式。Influencing the Optimizer Optimizer defaults are adequate for most operations, but not all.In some cases you may have information unknown to the optimizer, or need to tune the opti…

pthread_mutex_lock函數深度解析

摘要 pthread_mutex_lock是POSIX線程庫中用于實現線程同步的核心函數&#xff0c;它通過對互斥鎖的加鎖操作來確保多個線程對共享資源的安全訪問。本文從互斥鎖的歷史背景和發展脈絡入手&#xff0c;詳細解析了pthread_mutex_lock函數的設計理念、實現機制和使用場景。通過生產…

qt QBoxSet詳解

1、概述QBoxSet 類代表箱形圖中的一個條目。箱形條目是范圍和由五個不同值構成的三個中值的圖形表示。這五個值分別是&#xff1a;下極值、下四分位數、中位數、上四分位數和上極值。QBoxSet 提供了多種方法來設置和獲取這些值&#xff0c;并且可以與 QBoxPlotSeries 和 QChart…

機器學習勢函數(MLPF)入門:用DeePMD-kit加速億級原子模擬

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;從傳統分子模擬到機器學習勢函數的革命…

制作uniapp需要的storyboard全屏ios啟動圖

//鎖定豎屏 plus.screen.lockOrientation("portrait-primary") // #endif首先準備啟動圖兩個dc_launchscreen_portrait_background2x.png(750*1624)dc_launchscreen_portrait_background3x.png(1125*2436)LaunchScreen.storyboard文件內容如下<?xml version"…

OpenCV:答題卡識別

目錄 一、項目原理 二、環境準備 三、核心代碼實現 1. 導入必要庫 2. 定義關鍵函數 坐標點排序函數 透視變換函數 輪廓排序函數 圖像顯示函數 3. 主程序實現 圖像預處理 輪廓檢測與答題卡定位 透視變換矯正 答案識別與評分 四、實現效果 本文將介紹如何使用 Ope…

機器寵物(以四足寵物為主)四肢與關節的系統化設計指南

1. 目標與約束先行 目標&#xff1a;自然步態&#xff08;走/小跑/小跳&#xff09;、安全親和、低噪、跌倒不致損&#xff1b;支持地毯/木地板/瓷磚等家庭地面。約束&#xff1a;體重 1–6 kg&#xff1b;單次續航 ≥ 30–60 min&#xff1b;整機成本與可維護性&#xff1b;室…

spark hive presto doris 對substr函數的差異

Spark、Hive、Presto&#xff08;現更名為 Trino&#xff09;和 Doris&#xff08;原百度 Palo&#xff09;的 substr 函數在功能上都是用于截取字符串的子串&#xff0c;但在起始索引規則和參數含義上存在差異&#xff0c;這是導致結果不同的主要原因。以下是它們的具體區別&a…

開題報告之基于AI Agent智能問答的旅游網站

課題題目&#xff1a; 基于AI Agent智能問答的旅游網站 學生姓名&#xff1a; 學 號&#xff1a; 學 院&#xff1a; 專業年級&#xff1a; 指導教師&#xff1a; 開題報告word版&#xff1a; 開題報告word版 一、課題的研究目的和意義&#xff08;本…

HTB打靶復個小盤

文章目錄jerrySauGoodGamesdevvotexpaper最近打了不少靶場&#xff0c;雖然難度都不算高&#xff0c;但也學到不少東西&#xff0c;中間去打了一周的實網滲透&#xff0c;打完后聯系了一家企業準備面試&#xff0c;感覺面試準備的差不多了&#xff0c;回來繼續打靶&#xff0c;…

云手機的技術架構可分為哪些

一、基礎設施層為其提供計算、存儲和網絡資源&#xff0c;高性能的服務器 CPU 是關鍵&#xff0c;它需具備多核多線程處理能力&#xff0c;以同時支持多個云手機實例的運行&#xff0c;比如英特爾至強系列處理器&#xff0c;能夠有效處理復雜的運算任務&#xff1b;通過虛擬化技…

[創業之路-585]:初創公司的保密安全與信息公開的效率提升

初創公司處于快速發展與資源有限的雙重約束下&#xff0c;平衡保密安全與信息公開效率是生存與發展的關鍵。保密安全可保護核心資產&#xff08;如技術、客戶數據、商業計劃&#xff09;&#xff0c;避免被競爭對手模仿或惡意攻擊&#xff1b;而信息公開的效率則直接影響團隊協…

如何在Docker容器中為Stimulsoft BI Server配置HTTPS安全訪問

在 Stimulsoft BI Server 2025.3.1 版本中&#xff0c;新增了在 Docker 容器中運行 BI Server 的能力。本文將為大家介紹如何在容器環境中為 BI Server 配置 HTTPS 協議的數據傳輸&#xff0c;從而實現安全、加密的訪問。 為什么需要 HTTPS&#xff1f; **HTTPS&#xff08;S…

PPT中將圖片裁剪為愛心等形狀

在WPS演示和PowerPoint中&#xff0c;使用裁剪功能&#xff0c;可以將插入的圖片裁剪為各種形狀&#xff0c;例如心形、五角形、云朵形等等。WPS演示還可以指定裁剪的位置&#xff0c;更加靈活。一、在PowerPoint中裁剪圖片為愛心等形狀將圖片插入到幻燈片后&#xff0c;選中圖…