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系统流 ...
随机推荐
- Beta Scrum Day 4 — 听说
听说
- 关于JoptionPane提示框
import java.util.*; import javax.swing.JOptionPane; import javax.swing.UIManager; public class Main ...
- 项目冲刺Beta第一篇博客
Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060 排行榜界面美化 陈敬轩059 注册成功界面美化 黄兴067 登录界面美化 林国梽068 答题界 ...
- 使用GatewayWorker 开发个即时聊天demo
前言: 上手册以示尊重:https://www.kancloud.cn/walkor/gateway-worker/326138: https://www.cnblogs.com/fuqiang88/ ...
- Beta阶段——4
一.提供当天站立式会议照片一张: 二. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 完善了用户管理模式的功能 (2) 今天计划完成的工作: 对用户功能的添加. (3) ...
- sqlserver 对比数据库表是否完全一致的简单方法
1. 使用数据库的工具进行处理 tablediff.exe 工具目录 C:\Program Files\Microsoft SQL Server\\COM 工具使用说明 tablediff.exe - ...
- Implement Trie and find longest prefix string list
package leetcode; import java.util.ArrayList; import java.util.List; class TrieNode{ Boolean isWord; ...
- ng-include 上ng-controller 无法获取控件
A.Html内容如下 <div> <div kendo-grid="testGrid" k-options="testOptions"> ...
- jmeter 正则表达式提取
引用名称:自己定义的变量名称,后续请求将要引用到的变量名,如填写的是:id,后面的引用方式是${id} 正则表达式:提取内容的正则表达式,相当于lr中的关联函数 [() 括起来的部分就是需要提 ...
- POJ1637_Sightseeing tour
给一个联通图,有的是单向边,有的是双向边,问是否存在欧拉回路. 乍一看毫无思路,可以这样来搞,对于每条无向边,我们随便指定一个方向,看看是否能够做到所有点的度数之和为偶数. 接下来,对于我们指定的边, ...