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

智能推荐

基于ssm+vue.js的图书管理系统附带文章和源代码设计说明文档ppt-程序员宅基地

文章浏览阅读889次,点赞16次,收藏28次。博主介绍:CSDN深耕的技术专家、博客专家、有着常年的工作经验、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战精彩专栏 推荐订阅2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐JAVA精品实战案例《500套》微信小程序项目精品案例《500套》文末获取源码+数据库。

cmake开发环境 linux qt_使用 QtCreator 和 CMake 搭建 Linux 下的 STM32 开发环境-程序员宅基地

文章浏览阅读586次。系统环境:主机系统:Arch Linux 64bit交叉编译工具链:arm-none-eabi-gcc-9.3.0调试器:arm-none-eabi-gdb-9.1QtCreator 版本:4.11.2CMake 版本:3.17.1OpenOCD 版本:0.10.0硬件环境:STM32 型号:STM32F103RCT仿真调试器:ST-Link v2搭建步骤:1. 激活插件首先需要激活一个名为 Ba..._linux cmake可以编qt

C#winform程序中控件等比例缩放(主要针对主程序加载子程序)_winform 等比缩放-程序员宅基地

文章浏览阅读2k次。这里的等比例适用的是在主窗体中加载了多个子窗体,或者一个主程序引用了另外一个子程序dll这样等比例缩放,也并不是实际意义上的等比例,而是相当于重新加载子窗体,但子窗体里面的数据不能变化。 主窗体和子窗体加载这种就不介绍,直接介绍主程序加载子程序的dll这种,主窗体与子窗体与其类似。 先建立一个主程序,主程序就当做一个壳,里面简单放几个容器即可。再建立一个子程序,子程序可以随便加点窗口进去,主要是为了让主程序调用加载进主程序。为了实现所谓的等比例缩放,子窗体..._winform 等比缩放

Android 计时器Chronometer 使用及源码分析-程序员宅基地

文章浏览阅读852次,点赞27次,收藏22次。今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

lombok常用注解大全_lombok.singular.useguava-程序员宅基地

文章浏览阅读1.9w次,点赞24次,收藏94次。lombok可以帮助我们提升日常开发的效率jar包。里面有许多实用的注解。本文将对lombok的常用注解作使用介绍,对于一些实验性官方不推荐的注解只会简单介绍实验性注解可能会带来一些风险。注: 本文基于lombok-1.18.6本文部分内容机翻自官网文章目录lombok的引入和安装lombok的基本注解使用变量相关val和var@NonNull实体类相关@Getter and @..._lombok.singular.useguava

linux网络编程:多播(组播)编程_mcast 多播包-程序员宅基地

文章浏览阅读7.4k次,点赞3次,收藏36次。什么是多播 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。 多播,也称为“组播”,将局域网中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进..._mcast 多播包

随便推点

在Debian 10上安装MySQL_debian mysql安装-程序员宅基地

文章浏览阅读324次。MySQL是一个著名的开源数据库管理系统,用于存储和检索各种流行应用程序的数据。MySQL 是*LAMP*堆栈中的**M**,LAMP 堆栈是一组常用的开源软件,还包括 Linux、Apache Web 服务器和 PHP 编程语言。在本教程中,您将通过添加此存储库来安装最新版本的 MySQL,安装 MySQL 软件本身,确保安装安全,并测试 MySQL 是否正在运行并响应命令。_debian mysql安装

edge 此项内容已下载并添加到 Chrome 中。_一个小扩展,解决Chrome长期以来的大痛点...-程序员宅基地

文章浏览阅读1.6k次。PC 端最好用的浏览器非 Chrome 莫属,这是一件没什么悬念的事情。前两天发了一个小调查,也只能问 除了 Chrome 之外,你的备胎浏览器是什么?所以你如果问我 PC 端的浏览器有什么推荐?我的回答也没什么创意,那就是它,是它,就是它,我们的英雄小。。。。不好意思,走串场了。至于 Chrome 浏览器到底有多好用、多厉害,不用我多说,在我 N 次的彩虹屁下,小伙伴们应该早已下载并且用得得心应..._此项内容已下载并添加到 chrome 中。

vue js 点击按钮为当前获得焦点的输入框输入值_vue获得当前获得焦点的元素-程序员宅基地

文章浏览阅读1k次。VUE js 点击按钮为当前获得焦点的输入框输入值使用mousedown方法,可以阻止页面将焦点转移到按钮上<el-button @mousedown.native="entrySymbol($event,'+')">+</el-button>获取当前拥有焦点的输入框或文本域,并为其赋值 //输入符号 entrySymbol(e, symbol) { //取消失去焦点事件 e.preventDefault() //获_vue获得当前获得焦点的元素

Android 资源文件中@、@android:type、@*、?、@+含义和区别_@android @*android-程序员宅基地

文章浏览阅读675次。一.@代表引用资源1.引用自定义资源。格式:@[package:]type/nameandroid:text="@string/hello" 2.引用系统资源。格式:@android:type/name android:textColor="@android:color/opaque_red" 注意:其实@android:type/name _@android @*android

python中的正则表达式是干嘛的_Python中正则表达式介绍-程序员宅基地

文章浏览阅读541次,点赞2次,收藏3次。正则表通常是用来检索、替换那些符合某个模式(规则)的文本。也就是说使用正则表达式可以在字符串中匹配出你需要的字符或者字符串,甚至可以替换你不需要的字符或者字符串。正则(不是python特有的) 匹配字符串,其他语言也有正则表达式实例:需求:输入字符,判断字符串有无pythonimport rea=input("输入:")b=re.search("python",a)#搜寻匹配,匹配是第一个if b..._正则表达式的python脚本可作用什么

GeoGeo多线程_geo 多线程-程序员宅基地

文章浏览阅读525次。GeoGeo多线程GeoGeo多线程有2种,1种称之为函数线程,另1中称为过程线程。一、线程函数普通函数中,当程序的代码调用一个函数时,程序的控制从原来的代码转移到函数中执行,函数执行完毕后,程序的控制返回给原来调用该函数的代码中,然后继续向下执行。这个过程都在一个线程内顺序发生。而多线程函数是这样一些函数,当程序的控制调用线程函数时,马上创建一个新的线程并开始运行。新线程运行的同时,_geo 多线程

推荐文章

热门文章

相关标签