Android定位功能实现_android location-程序员宅基地

技术标签: java  android  kotlin  

Android定位功能实现

本文源码:[email protected]:sueleeyu/android-maps.git

android的定位功能有两种方式:

  1. 使用第三方地图sdk提供的定位功能。
  2. 使用sdk的Location实现,借助GPS(高精度)和网络(低精度)实现定位。

国内应用的话最好使用百度或高德sdk,较多室外场景或者数据精度要求不严的情况下可以使用原生方法。

一、google map定位

参考Android接入google地图:https://blog.csdn.net/weixin_40239288/article/details/125169826

二、使用Android的Location定位

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

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

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

2.使用LocationManager获取信息。
     LocationManager提供连接本地位置服务,这些本地位置允许应用程序获取定期更新设备的地理位置,或当设备进入一个特定的地理位置接近,触发一个特定意图,使用如下:
// 1需要检查权限,否则编译报错

if (Build.VERSION.SDK_INT >= 23 && ActivityCompat.checkSelfPermission(

        this,

        Manifest.permission.ACCESS_FINE_LOCATION

    ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(

        this,

        Manifest.permission.ACCESS_COARSE_LOCATION

    ) != PackageManager.PERMISSION_GRANTED

) {

    return

}

if (ActivityCompat.checkSelfPermission(

        this,

        Manifest.permission.ACCESS_FINE_LOCATION

    ) != PackageManager.PERMISSION_GRANTED

    && ActivityCompat.checkSelfPermission(

        this,

        Manifest.permission.ACCESS_COARSE_LOCATION

    ) != PackageManager.PERMISSION_GRANTED

) {

    return

}

//2.获取位置管理器

locationManager = getSystemService(LOCATION_SERVICE) as LocationManager

//3.获取位置提供器,GPS或是NetWork

val providers = locationManager!!.getProviders(true)

if (providers.contains(LocationManager.GPS_PROVIDER)) {

    //ProviderGPS

    locationProvider = LocationManager.GPS_PROVIDER

    Log.v("TAG", "定位方式GPS")

} else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {

    //ProviderNetwork

    locationProvider = LocationManager.NETWORK_PROVIDER

    Log.v("TAG", "定位方式Network")

} else {

    //Provider无

    Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show()

    return

}

//3.获取上次的位置,一般第一次运行,此值为null

val location = locationManager!!.getLastKnownLocation(

    locationProvider!!

)

if (location != null) {

    Toast.makeText(

        this, location.longitude.toString() + " " +

                location.latitude + "", Toast.LENGTH_SHORT

    ).show()

    Log.v(

        "TAG",

        "获取上次的位置-经纬度:" + location.longitude + "   " + location.latitude

    )

    tv_longitude?.setText("经度:"+location.longitude)

    tv_latitude?.setText("纬度:"+location.latitude)

    //getAddress(location)

} else {

    //监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace

        //locationListeneronLocationChanged更新数据

    locationManager!!.requestLocationUpdates(

        locationProvider!!,

        3000,

        1f,

        locationListener

    )

}
3.获取地址信息: Geocoder反向地理编码的使用
//获取地址信息:城市、街道等信息

private fun getAddress(location: Location?): List<Address>? {

    var result: List<Address>? = null

    try {

        if (location != null) {

            //反向地理编码

            val gc = Geocoder(this, Locale.getDefault())

            result = gc.getFromLocation(

                location.latitude,

                location.longitude, 1

            )

            Toast.makeText(this, "获取地址信息:$result", Toast.LENGTH_LONG).show()

            Log.v("TAG", "获取地址信息:$result")





        }

    } catch (e: Exception) {

        e.printStackTrace()

    }

    return result

}

三、android打包运行

1.安装运行

    

 

四、常见问题

1. java.io.IOException: grpc failed
原因为:the service is not available 服务不可用 即设备不支持Geocoder

五、参考文献

1.https://www.jianshu.com/p/fb89ab396bf8

2.本项目示例源代码:

[email protected]:sueleeyu/android-maps.git

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40239288/article/details/125199850

智能推荐

【生产问题--服务器宕机解决】_生产服务宕机了,我们通过哪些方式去定位问题-程序员宅基地

文章浏览阅读539次,点赞3次,收藏3次。线上服务器宕机问题的解决。如果你也有类似的问题,可以参考下。主要思路用mat 工具分析下.hprof文件_生产服务宕机了,我们通过哪些方式去定位问题

Qt on Android:图文详解Hello World全过程_qt kids-程序员宅基地

文章浏览阅读1.6k次。这是系列文章中的一篇,阅读本文前请先阅读《Windows下Qt 5.2 for Android开发入门》,以便确保开发环境和作者一致。部分文章被转发/转载却没有注明出处,特此声明:版权所有 foruok ,如需转载敬请注明出处(http://blog.csdn.net/foruok)。我将从实践出发,带领大家一步一步完成在 Android 上的第一个 Qt 应用: Hello Qt_qt kids

RIP、OSPF、BGP协议之间的区别_rip,ospf,bgp三个协议的区别-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏11次。③只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息,并且更新过程收敛的快,不会出现RIP“坏消息传得慢”的问题。②发送的信息是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。③网络出现故障时,会出现慢收敛现象,俗称“坏消息传得慢”,使更新过程的收敛时间长。②路由器之间交换的是路由器中的完整路由表,因此网络规模越大,开销也越大。:BGP是不同自治系统的路由器之间交换路由信息的协议,是一种外部网关协议。②路由器交换的信息是当前路由器所知道的全部信息,即。_rip,ospf,bgp三个协议的区别

uni-app运行到微信小程序报错[ pages/index/index.json 文件内容错误] pages/index/index.json: [“usingComponents“][“u-nav-程序员宅基地

文章浏览阅读6.1k次。uni-app运行到微信小程序时报错:“[ pages/index/index.json 文件内容错误] pages/index/index.json: [“usingComponents”][“u-navbar”] 未找到”这是由于引用了第三方UI库,比如uview,pages.json配置easycom规则(按需引入),使用了npm安装方式,但微信开发者工具没有构建npm,可以改下下载方式// pages.json{ "easycom": { // 下载安装的方式需要前面_[ pages/index/index.json 文件内容错误] pages/index/index.json: ["usingcompon

五分钟了解物联网SIM卡——这个文章刷新了我对sim卡的认识_中移物联nb-iot模块 不认识sim卡-程序员宅基地

文章浏览阅读6.7k次,点赞32次,收藏108次。嵌入式软件自留地 今天编者荐语:五分钟了解物联网SIM卡——这个文章刷新了我对sim卡的认识,不熟悉的可以看看~~以下文章来源于华为云IoT ,作者我是卤蛋这个文章来自网络,看了觉得不错,因此特意整理转载下。是华为iot小助手分享的,都知道华为在物联网领域是国内老大的地位,分享的文章还是比较有价值的。【摘要】SIM卡是移动通信中不可或缺的组成部分,在物联网解决方案中,设备移动上网也需要使用SIM卡。那么,SIM卡是什么?SIM卡有几种?各种SIM卡有什么区别?本文将为您答疑.._中移物联nb-iot模块 不认识sim卡

js获取当前Unix时间戳_js unix时间戳-程序员宅基地

文章浏览阅读1.1w次。JavaScript 获取当前时间戳:第一种方法:var timestamp = Date.parse(new Date());第二种方法:var timestamp=new Date().getTime();第三种方法:var timestamp = (new Date()).valueOf();第一种:获取的时间戳是把毫秒改成000显示,_js unix时间戳

随便推点

python抛出异常会终止程序吗_Python学习笔记之类型判断,异常处理,终止程序操作小结...-程序员宅基地

文章浏览阅读4.9k次。python学习笔记 类型判断,异常处理,终止程序,实例代码:#idle中按F5可以运行代码#引入外部模块 import xxx#random模块,randint(开始数,结束数) 产生整数随机数import randomimport sysimport ossecret = random.randint(1,10)temp = input("请输入一个数字\n")#print(type(temp..._程序抛出异常不一定终止程序

引用Dll失败-程序员宅基地

文章浏览阅读583次。C#中添加引用Dll文件必须先注册!!注册方法:regsvr32 *.dll (*代表Dll文件名称)!!_引用dll失败

vscode-python的debug 教学(最全)_vscode python debug_python vs debug-程序员宅基地

文章浏览阅读685次,点赞14次,收藏25次。Visual Studio Code 的主要功能之一是其强大的调试支持。VS Code 的内置调试器有助于加速编辑、编译和调试循环。在插件库内搜索python Debugger,安装插件(1)创建debug_learning.py测试文件(2)设置断点(2)启动debug模式(3)debug的各个按钮的介绍以下文档基于内置的 Node.js 调试器,但大多数概念和功能也适用于其他调试器。在阅读有关调试的信息之前,首先创建一个示例Node.js应用程序会很有帮助。您可以按照Node.js演练安_python vs debug

[附源码]计算机毕业设计Python+uniapp家校通微信小程序rjeuh(程序+lw+远程部署)_家校互通小程序开源-程序员宅基地

文章浏览阅读112次。Python3.7.7+Django+Mysql5.7+pip list+HBuilderX(Vscode也行)+uni+Vue+Pychram社区版。[附源码]计算机毕业设计Python+uniapp家校通微信小程序rjeuh(程序+lw+远程部署)2. 前端:uni+css+javascript+jQuery+easyUI+highcharts。Django + uni小程序 +Python+Mysql 等等组成,B/S模式等等。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。_家校互通小程序开源

快手 sig(sign)签名算法 java版_java获取快手视频评论数-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏31次。需求:想要获取快手短视频app的用户粉丝数声明:本博文只是作为研究学习用途,请不要用于非法、商业用途。写个帖子不容易,转载请说明出处,谢谢首先需要用Fidder抓包工具找到接口地址重点来了,快手所有的接口基本都用到了一个参数sig(数据签名)声明:本博文只是作为研究学习用途,请不要用于非法、商业用途。写个帖子不容易,转载请说明出处,谢谢首先需要用Fidder抓包工具找到接口地址这个过程省略..._java获取快手视频评论数

【100天精通python】Day1:python入门_初识python,搭建python环境,运行第一个python小程序_python一百天-程序员宅基地

文章浏览阅读3.3k次,点赞22次,收藏85次。Python是一种高级、通用、解释型编程语言。它具有简单易学的语法和强大的功能,适用于多种应用领域,包括Web开发、数据分析、人工智能和科学计算等。Python拥有庞大的社区支持,且拥有丰富的第三方库和工具,使得开发变得更加高效和便捷。python 语言不仅可以应用到网络编程、游戏开发等领域,还可以在图形图像处理、智能机器人、爬取数据、自动化运维等多方面发挥特长,为开发者提供简约、优雅的编程体验。_python一百天