使用Android 原生LocationManager獲取經緯度

一、常用方案

1、使用LocationManager GPS和網絡定位

缺點:個別設備,室內或者地下停車場獲取不到gps定位,故需要和網絡定位相結合使用

2、使用Google Play服務

這種方案需要Android手機中有安裝谷歌服務,然后導入谷歌的第三方庫:

例如:implementation 'com.google.android.gms:play-services-location:20.0.0'

缺點:一些廠商可能會閹割掉谷歌服務

3、使用第三方地圖定位

缺點:該方法準確度較高,但需要在第三方平臺注冊賬號和集成key

這里介紹第一種方案,如果獲取不到gps,先通過網絡定位獲取,然后再嘗試去獲取gps

博主這里就遇到同一個地方,小米可以通過gps獲取到數據,但一加的兩個手機,都無法通過gps獲取到經緯度,故只能先從網絡獲取經緯度

二、方案實現

class LocationManagerUtil {val TAG: String = "LocationManagerUtil_"var mLocationManager:LocationManager?=nullvar mLocationListener:LocationListener?=nullvar isSendLocation=truecompanion object {private var singleInstance: LocationManagerUtil? = nullget() {// 懶漢模式if (null == field) {field = LocationManagerUtil()}return field}@Synchronized // 添加注解,線程同步,線程安全fun getInstance(): LocationManagerUtil {return singleInstance!!}}fun registerListener(callback: LocationCallback){isSendLocation=trueunRegisterListener()mLocationManager = WebrtcSdkApplication.instance.getSystemService(Context.LOCATION_SERVICE) as LocationManager?mLocationListener = object : LocationListener {override fun onLocationChanged(location: Location) {if(location!=null){// 當位置發生變化時調用val latitude = location.latitudeval longitude = location.longitudeval provider=location.provider// 使用位置信息XLogUtil.d("${TAG}onLocationChanged longitude:$longitude,,,latitude:$latitude")//在室內或者地下室,gps可能會獲取不到地位,這時先根據網絡定位,待獲取到gps值后,關閉監聽if(provider==LocationManager.GPS_PROVIDER){isSendLocation=falseunRegisterListener()callback.onLocationChanged(longitude,latitude)}else if(provider==LocationManager.NETWORK_PROVIDER){if(isSendLocation){callback.onLocationChanged(longitude,latitude)}isSendLocation=false}}else{XLogUtil.d("${TAG}onLocationChanged location==null")}}override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {// 當GPS狀態改變時調用}override fun onProviderEnabled(provider: String) {// 當選中的位置提供者被激活時調用}override fun onProviderDisabled(provider: String) {// 當選中的位置提供者被停用時調用}}if (ActivityCompat.checkSelfPermission(WebrtcSdkApplication.instance,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(WebrtcSdkApplication.instance,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {//Toast.makeText(WebrtcSdkApplication.instance,WebrtcSdkApplication.instance.getString(R.string.please_enable_location_permissions_in_settings),Toast.LENGTH_SHORT).show()XLogUtil.d("${TAG}checkSelfPermission 定位權限未授權")}mLocationManager?.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 5f,mLocationListener!!)//更新間隔1000毫秒,距離間隔5米mLocationManager?.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 5f,mLocationListener!!)//更新間隔1000毫秒,距離間隔5米}fun unRegisterListener(){if(mLocationListener!=null){mLocationManager?.removeUpdates(mLocationListener!!)mLocationManager=nullmLocationListener=null}}}

三、相關權限

  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" <uses-permission android:name="android.permission.INTERNET" /><!--定位權限--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>//以下兩個權限需要動態申請權限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

四、判斷是否打開了gps

    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManagerif (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {// 提示用戶開啟GPSval intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)startActivity(intent)}

五、獲取的經緯度在不同地圖上顯示不一致問題解答

GPS獲得的經緯度所用的坐標系和谷歌地圖、百度地圖上的坐標系是不同的,GPS硬件獲得的經緯度是WGS-84標準,國際通用,
可以看成是正常的GPS位置,在google earth上全部坐標,谷歌地圖上除中國以外的坐標均為這個標準,但是谷歌地圖的中國坐標使用的是GCJ-02標準,
是天朝測繪局在WGS-84的基礎上加入隨機偏差加密后的一種經緯度,會隨機偏移一公里左右,所以導致無論怎樣定位總是顯示不對。
而百度地圖在GCJ-02上又加入了自己的加密算法,變成了BD-09標準,另外其他很多的地圖都有自己的加密方法。
這些都是硬件獲取經緯度在地圖上指示不對的原因,網上有免費做轉換的網站,
在這里推薦一個:http://map.yanue.NET/gps.html,如果發現GPS定位結果總是有誤差,可以用這個轉換一下

經緯度轉換為地點:【經緯度查詢】在線地圖經度緯度查詢|經緯度地名坐標轉換

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

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

相關文章

驗證碼實現

驗證碼案例 學了Spring MVC &#xff0c;配置 相關章節&#xff0c; 現可以嘗試寫一個前后端交互的驗證碼 文章目錄 驗證碼案例前言一、驗證碼是什么&#xff1f;二、需求1.引入依賴2.導入前端頁面3.約定前后段交互接口 三、代碼解析Controllermodelapplication.xml 四丶結果五…

查詢當前用戶的購物車和清空購物車

業務需求&#xff1a; 在小程序用戶端購物車頁面能查到當前用戶的所有菜品或者套餐 代碼實現 controller層 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

(多看) CExercise_05_1函數_1.2計算base的exponent次冪

題目&#xff1a; 鍵盤錄入兩個整數&#xff1a;底(base)和冪指數(exponent)&#xff0c;計算base的exponent次冪&#xff0c;并打印輸出對應的結果。&#xff08;注意底和冪指數都可能是負數&#xff09; 提示&#xff1a;求冪運算時&#xff0c;基礎的思路就是先無腦把指數轉…

【nacos安裝指南】

Nacos安裝指南 1.Windows安裝 開發階段采用單機安裝即可。 1.1.下載安裝包 在Nacos的GitHub頁面&#xff0c;提供有下載鏈接&#xff0c;可以下載編譯好的Nacos服務端或者源代碼&#xff1a; GitHub主頁&#xff1a;https://github.com/alibaba/nacos GitHub的Release下載…

通過發音學英語單詞:從音到形的學習方法

&#x1f4cc; 通過發音學英語單詞&#xff1a;從音到形的學習方法 英語是一種 表音語言&#xff08;phonetic language&#xff09;&#xff0c;但不像拼音文字&#xff08;如漢語拼音、西班牙語等&#xff09;那么規則&#xff0c;而是 部分表音部分表意。這意味著我們可以通…

列表某個字段由多個值組成,使用id匹配展示

說明&#xff1a;列表中字段A的值由多個值組成&#xff0c;但是后端返回的是這多個值的id字符串&#xff0c;需要前端拿著多個id組成的字符串去另一個接口數據源匹配展示 列表后端返回多個字符串如下&#xff1a; sectorName: "1899292545382895618,1907311191514636289…

MQL5教程 05 指標開發實戰:雙色線、雙線變色MACD、跨時間周期均線

文章目錄 一、雙色線指標二、雙線變色MACD指標三、跨時間周期均線 一、雙色線指標 這里的類型中&#xff0c;Color開頭的&#xff0c;是可以選擇多個顏色的。 #property indicator_chart_window #property indicator_buffers 18 #property indicator_plots 7 //--- plot xian…

Java全棧面試寶典:線程安全機制與Spring Boot核心原理深度解析

目錄 一、Java線程安全核心原理 &#x1f525; 問題1&#xff1a;線程安全的三要素與解決方案 線程安全風險模型 線程安全三要素 synchronized解決方案 &#x1f525; 問題2&#xff1a;synchronized底層實現全解析 對象內存布局 Mark Word結構&#xff08;64位系統&…

【Cursor】設置語言

Ctrl Shift P 搜索 configure display language選擇“中文-簡體”

【新能源汽車整車動力學模型深度解析:面向MATLAB/Simulink仿真測試工程師的硬核指南】

1. 前言 作為MATLAB/Simulink仿真測試工程師,掌握新能源汽車整車動力學模型的構建方法和實現技巧至關重要。本文將提供一份6000+字的深度技術解析,涵蓋從基礎理論到Simulink實現的完整流程。內容經過算法優化設計,包含12個核心方程、6大模塊實現和3種驗證方法,滿足SEO流量…

Java 線程池與 Kotlin 協程 高階學習

以下是Java 線程池與 Kotlin 協程 高階學習的對比指南&#xff0c;結合具體代碼示例&#xff0c;展示兩者在異步任務處理中的差異和 Kotlin 的簡化優勢&#xff1a; 分析&#xff1a; 首先&#xff0c;我們需要回憶Java中線程池的常見用法&#xff0c;比如通過ExecutorService創…

嵌入式EMC設計面試題及參考答案

目錄 解釋 EMC(電磁兼容性)的定義及其兩個核心方面(EMI 和 EMS) 電磁兼容三要素及相互關系 為什么產品必須進行 EMC 設計?列舉至少三個實際工程原因 分貝(dB)在 EMC 測試中的作用是什么?為何采用對數單位描述干擾強度? 傳導干擾與輻射干擾的本質區別及典型頻率范圍…

實操(進程狀態,R/S/D/T/t/X/Z)Linux

1 R 狀態并不直接代表進程在運行&#xff0c;而是該進程在運行隊列中進行排隊&#xff0c;由操作系統在內存維護的隊列 #include <stdio.h> #include <unistd.h>int main() {while(1){printf("我在運行嗎\n");sleep(1);}return 0; }查看狀態&#xff08…

React 文件上傳新玩法:Aliyun OSS 加持的智能上傳組件

文件上傳是前端開發中的“老朋友”&#xff0c;但如何讓它既簡單又強大&#xff0c;還能無縫對接云端存儲&#xff1f;今天&#xff0c;我要帶你認識一個超酷的 React 組件 AliUploader&#xff0c;它不僅支持拖拽上傳、批量編輯和文件排序&#xff0c;還直接把文件傳到 Aliyun…

LabVIEW多線程

在 LabVIEW 中&#xff0c;多線程編程是提升程序執行效率的關鍵手段&#xff0c;尤其是在需要并行處理數據采集、控制執行和用戶界面交互的場景下。LabVIEW 本身是基于數據流&#xff08;Dataflow&#xff09;的編程語言&#xff0c;天然支持多線程&#xff0c;但要高效利用多線…

圖解AUTOSAR_SWS_LINStateManager

AUTOSAR LIN狀態管理器(LinSM)詳細設計 文檔摘要 本文檔提供了AUTOSAR LIN狀態管理器(LinSM)模塊的詳細設計解析,包括架構、狀態機、睡眠喚醒流程以及配置結構。通過圖形化方式展現LinSM在AUTOSAR通信棧中的作用及其與其他模塊的交互關系。 目錄 AUTOSAR LIN狀態管理器(Lin…

python+form+opengl顯示動態圖形數據

說明&#xff1a; pythonformopengl顯示動態圖形數據 我希望做一款動態opengl圖形數據 1.用python腳本&#xff0c;輸入指定參數 2.生成一組數據&#xff0c; 3.將數據保持成本地文件 4.在c#中調用此文件&#xff0c;解析 5.將數據用opengl展示 效果圖: step1:添加依賴 C:\U…

Android Gradle、Android Gradle Plugin、BuildTool關系

1. Gradle 的定位&#xff1a;通用構建工具 Gradle 是一個通用的跨平臺構建工具&#xff0c;支持多種語言&#xff08;如 Java、Kotlin、C&#xff09;和項目類型 它的核心功能包括&#xff1a; ?任務自動化&#xff1a;通過 Groovy/Kotlin DSL 腳本定義編譯、測試、打包等…

DHCP之報文格式

字段說明&#xff1a; op (op code): 表示報文的類型&#xff0c;取值為 1 或 2&#xff0c;含義如下 1:客戶端請求報 2:服務器響應報文 Secs (seconds):由客戶端填充&#xff0c;表示從客戶端開始獲得 IP 地址或 IP 地址續借后所使用了的秒數&#xff0c;缺省值為 3600s。 F…

觀察者模式在Java微服務間的使用

一.、使用RabbitMQ來實現 (1) 生產者&#xff08;訂單微服務&#xff09; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service;Service public class OrderService {private final RabbitTemplate rabbitTemplate;…