Android 使用高德SDK获取定位

在Android开发过程中,经常需要获取手机的定位,这里记录一下使用搞的定位的过程。我选择使用高德的SDK,其实也有Web的API,但是API使用IP定位,Android SDK可以使用多种定位方式。

文章目录

  • Android 使用高德SDK获取定位
    • 说明
    • 开发过程
      • Android Studio新建项目
      • 申请高德 Key
        • 新建应用
        • 添加Key
        • Android Studio 配置工程
          • 通过拷贝集成SDK
        • 获取天气定位
          • 配置AndroidManifest.xml
            • 首先,声明Service组件
            • 然后,声明权限
            • 最后,设置高德Key
          • 初始化定位
            • 最后一步,停止定位
    • 常见错误
      • 使用Android SDK 调用高德业务返回INVALID_USER_SCODE

说明

本文2020.4.12更新,此时文中所有内容均已实践

高德开放平台
功能需要,我使用的是Android 定位SDK,其他SDK类似。

开发过程

Android Studio新建项目

新建一个项目,留意包名,后面要用到。
如果是打开原有项目,注意调整build.gradle文件的applicationid与package一致

申请高德 Key

自己去注册账号,申请个人开发者也比较简单

新建应用


类型选择Android SDK

添加Key


输入发布版安全码 SHA1、调试版安全码 SHA1、以及 Package。

Package与自己的AndroidManifest.xml 配置文件包名一致

填写的SHA1值与本地的SHA1值 匹配(debug或者release至少有一个与本地的SHA1一致)

本地的SHA1获取方法:
向程序中添加以下代码段获取当前APK使用的签明文件SHA1。

public static String sHA1(Context context){try {PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);byte[] cert = info.signatures[0].toByteArray();MessageDigest md = MessageDigest.getInstance("SHA1");byte[] publicKey = md.digest(cert);StringBuffer hexString = new StringBuffer();for (int i = 0; i < publicKey.length; i++) {String appendString = Integer.toHexString(0xFF & publicKey[i]).toUpperCase(Locale.US);if (appendString.length() == 1)hexString.append("0");hexString.append(appendString);hexString.append(":");}String result = hexString.toString();return result.substring(0, result.length()-1);} catch (NameNotFoundException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;
}

在Activity中调用一下

String s = sHA1(WeatherActivity.this);//鉴权
Log.e("sHA1:", s);

就可以打印出来。
填上即可。

Android Studio 配置工程

Android 定位SDK 相关下载

通过拷贝集成SDK

1、拷贝 jar 文件至 libs 文件夹下
将下载的定位 SDK jar 文件复制到工程的 libs 目录下,如果有老版本定位 jar 文件存在,请删除。定位 SDK 无需 so 库文件支持。
2. Add
切换到Project目录下,右键jar包,选择add as library。OK
3. 配置 build.gradle 文件 一般默认就行
在 build.gradle 文件的 dependencies 中配置
compile fileTree(include: ['*.jar'], dir: 'libs')。

获取天气定位

配置AndroidManifest.xml
首先,声明Service组件

请在application标签中声明service组件,每个app拥有自己单独的定位service。

<service android:name="com.amap.api.location.APSService"></service>
然后,声明权限
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--用于写入缓存数据到扩展存储卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
最后,设置高德Key

在application标签中加入:

<meta-data android:name="com.amap.api.v2.apikey" android:value="key">//开发者申请的key
</meta-data>
初始化定位

在Activity中

//声明AMapLocationClient类对象public AMapLocationClient mLocationClient = null;//声明定位回调监听器public AMapLocationListener mLocationListener = new MyAMapLocationListener();//声明AMapLocationClientOption对象public AMapLocationClientOption mLocationOption = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {//初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位回调监听mLocationClient.setLocationListener(mLocationListener);//初始化AMapLocationClientOption对象mLocationOption = new AMapLocationClientOption();//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//获取一次定位结果://该方法默认为false。mLocationOption.setOnceLocation(false);//获取最近3s内精度最高的一次定位结果://设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。//mLocationOption.setOnceLocationLatest(true);//获取一次定位结果://该方法默认为false。mLocationOption.setOnceLocation(true);//设置是否返回地址信息(默认返回地址信息)mLocationOption.setNeedAddress(true);//设置是否允许模拟位置,默认为false,不允许模拟位置mLocationOption.setMockEnable(false);//关闭缓存机制mLocationOption.setLocationCacheEnable(false);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}private class MyAMapLocationListener implements AMapLocationListener {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {//此处获得成功,可以参照返回值表取需要的参数,我只要了省市县Log.e("位置:", aMapLocation.getAddress());Gprovince = aMapLocation.getProvince();Gcity = aMapLocation.getCity();Gdistrict = aMapLocation.getDistrict();} else {//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}}

参数详细说明见官网
错误码参考表

最后一步,停止定位

停止定位

mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁

销毁定位客户端
销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。

mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务

常见错误

使用Android SDK 调用高德业务返回INVALID_USER_SCODE

当返回INVALID_USER_SCODE(不是INVALID_USER_KEY哦),或错误码1008、32和7,可按照如下操作解决问题:

检查SHA1值 //参照本文Key值获取部分
检查包名
Key值填写位置

详细说明,参照官网

祝各位开发顺利无Bug。

【Android笔记】Android 使用高德SDK获取定位相关推荐

  1. android使用高德地图SDK获取定位信息

    注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...

  2. Android使用高德和风天气Sdk获取定位实况天气数据(二)

    Android使用高德和风天气Sdk获取定位实况天气数据(二) 先看一下效果 关于 实现 第一步,引用高德api与和风天气 第二步,修改AndroidManifest.xml 第三步,修改activi ...

  3. 微信小程序整合高德地图获取定位经纬度信息

    1.登录高德地图https://lbs.amap.com/ a.创建新应用 这个key后边整合的时候会用到,精彩继续 b.下载SDK  https://lbs.amap.com/api/wx/down ...

  4. uniapp 开发微信小程序,通过高德SDK获取当位置详细信息

    背景: 需求是需要获取到当前位置的详细信息(结构化地址(省/市/区/街道/门牌号)) 首先想到的是通过uni的getLocation() 获取当前位置,但是发现只能获取到经纬度坐标点,无法获取到结构化 ...

  5. uni-app 微信小程序 用高德sdk获取地理位置,以及天气信息

    uni-app 微信小程序采用高德sdk获取地理位置和天气信息主要有以下几个步骤: 1. 注册高德开发者,并获取应用key 概述-微信小程序插件 | 高德地图API 在这个网页最下面,按步骤来就可以了 ...

  6. Android 手机app三种方法获取定位地址(自带API,外接SDK,获取外网IP)

    一.手机App定位在我看来有三种方法: 1.通过Android自带的API:LocationManager获取到经纬度,再通过Geocoder反地理位置查询到所在的地址. 2.外接SDK,如高德SDK ...

  7. Android开发丶基于高德地图实现定位、搜索定位、绘制圆圈自定义图标及改变圆圈半径等功能

    前一段时间接了个需求,进入一个地图界面,可以获取当前位置信息,通过输入位置信息获取位置,绘制圆圈并可以实时改变圆圈半径等功能,地图SDK我们使用的是高德地图,仔细阅读了开发文档,发现这些需求都可以通过 ...

  8. Android - 简单的显示高德SDK中的3D地图

    简单的显示高德SDK中的3D地图 身为一个安卓小白,前几天试了一下高德SDK,踩了几个蠢蠢的坑,秉承着别让其他小白也踩到,我就写一篇怎么简单的实现高德SDK显示地图与小蓝点的教程. 获得key 1.先 ...

  9. Android开发:集成高德地图实现定位、检索周边地址

    需求 1.后台传给我们一个经纬度,然后需要我们在地图上显示出来 2.当我们点击地图的时候进入到第二个界面,实现当前位置的定位,并且检索周边的商家地址,点击后将选中的地址回传,并显示,而我们上传给后台的 ...

最新文章

  1. php每分钟刷新一次的验证码,php如何在进入页面的时候自动刷新一次验证码
  2. linux顺序合并多个文件,linux – 合并多个文件,保留unix中的原始序列
  3. 润乾报表JSF FORM 标签中使用填报表解决方案
  4. 网络安全netstat监听网络状态。
  5. java生成Json文件
  6. 两个向量组的秩相等说明什么_解析几何初步:向量与坐标(一)
  7. Java并发编程笔记之LinkedBlockingQueue源码探究
  8. 图注意力网络(Graph Attention Network, GAT) 模型解读与代码实现(tensorflow2.0)
  9. 深入理解 JVM Class文件格式(三)
  10. Android kotlin基础语法
  11. python快速接手别人的代码_十步教你如何接手别人的代码!
  12. sklearn 交叉验证与参数寻优
  13. (Sublime Text 3)完美替换 GAMS 难用的编辑器
  14. ibm system x服务器重装系统,IBM X346服务器重装系统_xSeries 346阵列配置
  15. Intriguing properties of neural networks手动翻译
  16. 今日的质量,明日的市场--谈谈软件登记测试
  17. 08-cmd定时关机和取消定时关机
  18. Postgres忘记密码如何修改密码
  19. 因硬盘变动导致的ubuntu启动错误: /dev/sda1 xxxx clean, xxxx/xxxx files, xxxx/xxxx blocks
  20. 亚像元定位 硬分类 软分类

热门文章

  1. idea 如何将本地新建项目上传到gitlab
  2. 如何使用Echarts设计专业的K线图
  3. 项目上线,部署到服务器(腾讯服务器),http协议及https协议(微信小程序必须https协议才可发布)、Nginx配置
  4. 非常不错的编程技术教程
  5. MySQL用逗号进行拼接、以逗号进行分割
  6. Ubuntu fcitx输入法占用内存越来越大(超过1G)
  7. IT男容易出现的几个问题
  8. 百万调音师—Audition 重新混合
  9. 关于VMware虚拟机设置NAT后还不能上网解决办法
  10. java基础知识学习小总结(一)