Android 使用GPS获取到经纬度后 无法在Android8.0上使用Geocoder类获取位置信息
由于我的应用在获取到经纬度后在Android8.0不能使用如下代码获取位置信息。只好使用百度地图 WEB服务API 通过调接口的方式获取位置信息。
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
首先需要有百度开发者账户,以便获取key/ak,这个很简单略过。请求地址:
String url = String.format(
"http://api.map.baidu.com/geocoder/v2/?ak=qmalblOI3MvyturtOgNw0pvp********" +
"&location=%s,%s&output=json&pois=1&coordtype=wgs84ll" +
"&mcode=E2:AE:A4:FA:64:56:E4:B8:08:25:70:6A:E5:55:B8:E2:BD:**:**:**;com.myapp",
latitude, longitude);
其中ak为用户申请注册的key。mcode为安全码,在百度开发者平台的“我的应用”进入创建的应用即可看到安全码。coordtype为参数中经纬度坐标类型,默认为百度的坐标类型。
官方文档 请仔细查看官方文档
参数名 | 参数含义 | 类型 | 举例 | 默认值 | 是否必须 |
---|---|---|---|---|---|
location | 根据经纬度坐标获取地址。 | float | 38.76623,116.43213
lat<纬度>,lng<经度> |
无 | 是 |
coordtype | 坐标的类型,目前支持的坐标类型包括:bd09ll(百度经纬度坐标)、bd09mc(百度米制坐标)、gcj02ll(国测局经纬度坐标,仅限中国)、wgs84ll( GPS经纬度) 坐标系说明 | string | bd09ll、gcj02ll | bd09ll | 否 |
_coordtype | 可选参数,添加后返回国测局经纬度坐标或百度米制坐标 坐标系说明 | string | gcj02ll(国测局坐标,仅限中国)、bd09mc(百度墨卡托坐标) | bd09ll(百度经纬度坐标) | 否 |
pois | 是否召回传入坐标周边的poi,0为不召回,1为召回。当值为1时,默认显示周边1000米内的poi。 注意:若需访问海外POI,需申请「逆地理编码海外POI」服务权限,请提交工单申请。 |
int | 0 | 0 | 否 |
radius | poi召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。 | int | 500 | 1000 | 否 |
ak | 用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key” 申请ak | string | E4805d16520de693a3fe70 | 无 | 是 |
sn | 若用户所用ak的校验方式为sn校验时该参数必须 sn生成 |
string | 无 | 否 | |
output | 输出格式为json或者xml | string | json或xml | xml | 否 |
callback | 将json格式的返回值通过callback函数返回以实现jsonp功能 | string | callback=showLocation(JavaScript函数名) | 无 | 否 |
extensions_poi | 区别于pois参数,pois=0,不召回pois数据,但后端仍访问poi相应服务;extensions_poi=null时,后端不调用poi相关服务,可减少服务访问时延。 注意:若需访问海外POI,需申请「逆地理编码海外POI」服务权限,请提交工单申请。 |
string | null | 无 | 否 |
extensions_road | 当取值为true时,召回坐标周围最近的3条道路数据。区别于行政区划中的street参数(street参数为行政区划中的街道,和普通道路不对应)。 | string | false、true | false | 否 |
extensions_town | 当取值为true时,行政区划返回乡镇级数据(仅国内召回乡镇数据)。默认不访问。 | string | true | 无 | 否 |
language | 指定召回的新政区划语言类型。 召回行政区划语言list(全量支持的语言见示例)。 当language=local时,根据请求中坐标所对应国家的母语类型,自动选择对应语言类型的行政区划召回。 目前支持多语言的行政区划区划包含country、provence、city、district 注意:多语言需申请「逆地理编码海外POI」服务权限,请提交工单申请。 |
string | el gu en vi ca it iw sv eu ar cs gl id es en-GB ru sr nl pt tr tl lv en-AU lt zh-TW th ro fil ta fr bg hr bn de hu fa hi pt-BR fi da ja te pt-PT ml ko kn sk zh-CN pl uk sl mr local |
en,国内默认zh-CN | 否 |
language_auto | 是否自动填充行政区划。 1填充,0不填充。 填充:当服务按某种语言类别召回时,若某一行政区划层级数据未覆盖,则按照“英文→中文→本地语言”类别行政区划数据对该层级行政区划进行填充,保证行政区划数据召回完整性。 注意:多语言需申请「逆地理编码海外POI」服务权限,请提交工单申请。 |
int | 0、1 | 无 | 否 |
latest_admin | 是否访问最新版行政区划数据(仅对中国数据生效),1(访问),0(不访问) | int | 0、1 | 0 | 否 |
名称 | 含义 | 类型 | |
---|---|---|---|
status | 返回结果状态值, 成功返回0,其他值请查看下方返回码状态表。 | int | |
location | 经纬度坐标 | object | |
lat | 纬度值 | float | |
lng | 经度值 | float | |
formatted_address | 结构化地址信息 | string | |
business | 坐标所在商圈信息,如 "人民大学,中关村,苏州街"。最多返回3个。 | string | |
addressComponent (注意,国外行政区划,字段仅代表层级) |
country | 国家 | string |
province | 省名 | string | |
city | 城市名 | string | |
district | 区县名 | string | |
town | 乡镇名 | string | |
street | 街道名(行政区划中的街道层级) | string | |
street_number | 街道门牌号 | string | |
adcode | 行政区划代码 adcode映射表 | int | |
country_code | 国家代码 | int | |
direction | 相对当前坐标点的方向,当有门牌号的时候返回数据 | string | |
distance | 相对当前坐标点的距离,当有门牌号的时候返回数据 | string | |
pois(周边poi数组) | addr | 地址信息 | string |
cp | 数据来源(已废弃) | string | |
direction | 和当前坐标点的方向 | string | |
distance | 离坐标点距离 | int | |
name | poi名称 | string | |
poiType | poi类型,如’ 办公大厦,商务大厦’ | string | |
point | poi坐标{x,y} | float | |
tel | 电话 | int | |
uid | poi唯一标识 | string | |
zip | 邮编 | int | |
parent_poi | poi对应的主点poi(如,海底捞的主点为上地华联,该字段则为上地华联的poi信息。如无,该字段为空),包含子字段和pois基础召回字段相同。 | ||
poiRegions | direction_desc | 请求中的坐标与所归属区域面的相对位置关系 | string |
name | 归属区域面名称 | string | |
tag | 归属区域面类型 | string | |
sematic_description | 当前位置结合POI的语义化结果描述。 | string | |
cityCode | 百度定义的城市id(正常更新与维护,但建议使用adcode) | int |
返回码 | 英文描述 | 定义 | 常见原因 |
---|---|---|---|
0 | ok | 正常 | 服务请求正常召回 |
1 | 服务器内部错误 | ||
2 | Parameter Invalid | 请求参数非法 | 必要参数拼写错误或漏传(如query和tag请求中均未传入) |
3 | Verify Failure | 权限校验失败 | |
4 | Quota Failure | 配额校验失败 | 服务当日调用次数已超限,请前往API控制台提升(请优先进行开发者认证) |
5 | AK Failure | ak不存在或者非法 | 未传入ak参数;ak已被删除(可前往回收站恢复); |
101 | 服务禁用 | ||
102 | 不通过白名单或者安全码不对 | ||
2xx | 无权限 | ||
3xx | 配额错误 |
PS:不同坐标系之间转换http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=10923&logout=success
public class CoordinatesTransformation { static double pi = 3.14159265358979324;
static double a = 6378245.0;
static double ee = 0.00669342162296594323;
public final static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; public static double[] wgs2bd(double lat, double lon) {
double[] wgs2gcj = wgs2gcj(lat, lon);
double[] gcj2bd = gcj2bd(wgs2gcj[0], wgs2gcj[1]);
return gcj2bd;
} public static double[] gcj2bd(double lat, double lon) {
double x = lon, y = lat;
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
double bd_lon = z * Math.cos(theta) + 0.0065;
double bd_lat = z * Math.sin(theta) + 0.006;
return new double[] { bd_lat, bd_lon };
} public static double[] bd2gcj(double lat, double lon) {
double x = lon - 0.0065, y = lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
double gg_lon = z * Math.cos(theta);
double gg_lat = z * Math.sin(theta);
return new double[] { gg_lat, gg_lon };
} public static double[] wgs2gcj(double lat, double lon) {
double dLat = transformLat(lon - 105.0, lat - 35.0);
double dLon = transformLon(lon - 105.0, lat - 35.0);
double radLat = lat / 180.0 * pi;
double magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
double mgLat = lat + dLat;
double mgLon = lon + dLon;
double[] loc = { mgLat, mgLon };
return loc;
} private static double transformLat(double lat, double lon) {
double ret = -100.0 + 2.0 * lat + 3.0 * lon + 0.2 * lon * lon + 0.1 * lat * lon + 0.2 * Math.sqrt(Math.abs(lat));
ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lon * pi) + 40.0 * Math.sin(lon / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lon / 12.0 * pi) + 320 * Math.sin(lon * pi / 30.0)) * 2.0 / 3.0;
return ret;
} private static double transformLon(double lat, double lon) {
double ret = 300.0 + lat + 2.0 * lon + 0.1 * lat * lat + 0.1 * lat * lon + 0.1 * Math.sqrt(Math.abs(lat));
ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lat / 12.0 * pi) + 300.0 * Math.sin(lat / 30.0 * pi)) * 2.0 / 3.0;
return ret;
}
}
Android 使用GPS获取到经纬度后 无法在Android8.0上使用Geocoder类获取位置信息的更多相关文章
- vue 获取页面详情后 切换页面时 如何监听用户是否修改过信息
可以用 beforeRouteLeave 和 updated 来判断.export default { name: 'supplier', components:{cmtWrap,cmtContent ...
- 关于 android百度地图 调用 地理位置 经纬度坐标,只调用一次的解决方法,通知栏不总是 搜索 GPS 。。。
上代码吧... //读取当前坐标 final LocationClient mLocationClient = new LocationClient(mActivity); mLocationClie ...
- Android获取位置信息的方法总结
1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综 ...
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- Android GPS应用:动态获取位置信息
在上文中,介绍了GPS概念及Android开发GPS应用涉及到的常用类和方法.在本文中,开发一个小应用,实时获取定位信息,包括用户所在的纬度.经度.高度.方向.移动速度等.代码如下: Activity ...
- Android初级教程获取手机位置信息GPS与动态获取最佳方式
简单介绍一下gps定位的操作. 主要是靠locationmanger这个api完成的一些操作:通过获取这个实例,然后调用它的requestLocationUpdates方法进行注册.传入的参数分别有以 ...
- android调用系统的自定义裁剪后得到的图片不清晰,使用MediaStore.EXTRA_OUTPUT获取缓存下的清晰图片
在使用系统自带的剪切图片工具时,通常只能设置一些比较小的值,像 intent.putExtra("outputX", 320); intent.putExtra("out ...
- 手机防盗之获取手机经纬度(Android)
获取手机经纬度有gps , network , 基站 三种方式,我们可以根据定位的条件,获取一个最好的定位方式.然后将获取到经纬度信息发送到指定的手机号码中. /* * 单态只允许存在一个实例. * ...
- qt on android之GPS信号的获取
0. 写在最前面 本人參考安晓辉大侠的一篇博文后.做了Qt on android的GSP相关的实验.为了后面不时之需.故而记录下来. 1. Qt on Android GPS系统流 ...
随机推荐
- Linux下管道重定向使用以及Shell编程(操作系统)
实验名称:Linux的基本操作 实验目的: 1.了解管道和重定向 2.熟悉基本的Linux脚本的编写 实验环境:Ubuntu 12.4(32位,简体中文) 实验内容: 1.将当前用户目录下的文件清单输 ...
- 深入理解Java虚拟机&运行时数据区
其中,程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭.
- vue 实战报错解决方案
最近做项目,遇到一个问题 列表滚动,上拉加载功能 采用了better-scroll 插件,将better-scroll 封装成组件,采用父组件传递值给子组件的方式,子组件 采用$emit 方式 通知父 ...
- 学习laravel源码之中间件原理
刨析laravel源码之中间件原理 在看了laravel关于中间件的源码和参考了相关的书籍之后,写了一个比较简陋的管道和闭包实现,代码比较简单,但是却不好理解所以还是需要多写多思考才能想明白其中的意义 ...
- yaf windows安装
1.需要先下载 php_yaf模块.地址(http://pecl.php.net/package/yaf/2.3.2/windows) 看清你的php版本,然后在phpinfo中看Achitectur ...
- PHP学习心得2
对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小 ...
- JS 随机整数
<script> function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random() ...
- QComboBox 树形视图选择
QComboBox 控件支持树形图显示. A. void QComboBox::setModel(QAbstractItemModel *model): B. void QComboBox::se ...
- Educational Codeforces Round 56 Div. 2 翻车记
A:签到. B:仅当只有一种字符时无法构成非回文串. #include<iostream> #include<cstdio> #include<cmath> #in ...
- 【BZOJ3534】重建(矩阵树定理)
[BZOJ3534]重建(矩阵树定理) 题面 BZOJ 洛谷 题解 这.... 矩阵树定理神仙用法???? #include<iostream> #include<cmath> ...