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

智能推荐

java readutf()方法,java socket writeUTF()和readUTF()-程序员宅基地

文章浏览阅读207次。I've been reading some Java socket code snippet and fonund out a fact that in socket communication, to send messages in sequence, you don't have to seperate them by hand, the writer/reader stream do t..._java socket writeutf

ssh远程登录_ssh登录命令-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏7次。l 指定登录名称;基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs。服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc。3)客户端得到服务端的信息后,通过算法生成密钥,结合自己的公钥生成密钥对,然后将密钥对发送给服务端。5)最后,客户端拥有自己的公钥和私钥以及服务端的公钥,服务端拥有自己的公钥和私钥以及客户端的公钥。_ssh登录命令

C神奇操作(1)--static inline_static inline的优点-程序员宅基地

文章浏览阅读258次。C神奇操作(1)_static inline的优点

西安未来人工智能计算中心人工智能实训基地介绍_西安ai智造基地-程序员宅基地

文章浏览阅读285次。成老师,深度人工智能教育创始人、资深人工智能讲师、高级人工智能算法工程师,四川省人工智能研究院AI人才培训中心前主讲老师,5年人工智能算法领域研发经验,4年人工智能教学经验,具备扎实的人工智能算法理论基础知识和丰富的项目实战经验,具有丰富的人工智能教学经验。曾老师,高级人工智能算法工程师、资深人工智能售前工程师,曾任国内一线互联网公司资深嵌入式工程师、AI独角兽企业——商汤科技公司客户交付工程师,曾从事工作包括嵌入式开发,AI算法研发,客户售前、售后技术支持等,具有精湛的售前售后技术,丰富的行业实战经验。_西安ai智造基地

BIOS详解_preinstalled os license-程序员宅基地

文章浏览阅读1.6w次,点赞24次,收藏147次。5分钟快速了解BIOS,换硬盘装系统再不求人_preinstalled os license

OpenStack(kilo)界面dashboard的二次开发(三)-增加Dashboard_openstack图形界面怎么自定义-程序员宅基地

文章浏览阅读4.2k次。前面的博文已经完成了panel与panelgroup的自定义增加,这篇博文将对Dashboard(一级菜单)的增加进行一个简单总结。增加Dashboard(一级菜单)增加Dashboard(一级菜单)首先进入/usr/share/openstack-dashbaord/openstack_dashboard/dashboards目录,会看到如下的目录结构:..._openstack图形界面怎么自定义

随便推点

使用Ionic.Zip压缩、分卷压缩、解压文件-程序员宅基地

文章浏览阅读1.8k次。分卷压缩使用方法: int iMinLength = 100;//最小压缩包单位(100M) ZipHelper.Compress("../../../xxx.xx", "../../../xx.zip", ZipDataUnit.MB, iMinLength);//分卷压缩解压使用方法 : string strUnZipPath = Environment.CurrentDirectory + "\\DeCompress"; _ionic.zip

【pytorch3d】running build_ext error: [WinError 2] 系统找不到指定的文件-程序员宅基地

文章浏览阅读1.8k次。只留CUDA一个就够了。甚至我觉得,只要Develpment和Runtime两个就够了(不保正确,我没试过)_running build_ext

iOS 基于MVVM设计模式练习UITableView使用 —— HERO博客_mvvm uitableview-程序员宅基地

文章浏览阅读8.4k次,点赞5次,收藏2次。iOS 基于MVVM设计模式练习UITableView使用。_mvvm uitableview

打印当前进程线程的名称和数量-程序员宅基地

文章浏览阅读447次,点赞10次,收藏9次。【代码】打印当前进程线程的名称和数量。

Glide图片框架使用详细介绍(一),Github上最值得学习的10个Android开源项目_com.github.bumptech.glide的作用-程序员宅基地

文章浏览阅读628次,点赞11次,收藏29次。在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。Picasso本身就是简单方便的图片加载框架,Glide是在Picasso的基础上进行改良的,更加好用。优点有:使用简单可配置度高,自适应程度高支持常见图片格式 Jpg png gif webp支持多种数据源 网络、本地、资源、Assets 等。_com.github.bumptech.glide的作用

基于MATLAB的车牌识别研究-程序员宅基地

文章浏览阅读21次。随着我国公路事业的发展,人工管理方式已经不能满足如今实际的需要。车牌识别技术是计算机视频图像识别技术在车辆牌照识别中的一种应用,是现代智能交通系统(Intelligent Traffic System,简称ITS)中的重要组成部分之一。车牌识别系统(vehicle license plate recognition system,简称LPR)使车辆管理更加智能化、数字化,有效提升了交通管理的效率。对于交通管理、治安处罚等工作的智能化起着十分重要的作用。它可广泛应用于交通流量检测,交通控制与诱导,机场、港

推荐文章

热门文章

相关标签