由于我的应用在获取到经纬度后在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根据经纬度坐标获取地址。float38.76623,116.43213

lat<纬度>,lng<经度>

coordtype坐标的类型,目前支持的坐标类型包括:bd09ll(百度经纬度坐标)、bd09mc(百度米制坐标)、gcj02ll(国测局经纬度坐标,仅限中国)、wgs84ll( GPS经纬度) 坐标系说明stringbd09ll、gcj02llbd09ll
_coordtype可选参数,添加后返回国测局经纬度坐标或百度米制坐标 坐标系说明stringgcj02ll(国测局坐标,仅限中国)、bd09mc(百度墨卡托坐标)bd09ll(百度经纬度坐标)
pois是否召回传入坐标周边的poi,0为不召回,1为召回。当值为1时,默认显示周边1000米内的poi。
注意:若需访问海外POI,需申请「逆地理编码海外POI」服务权限,请提交工单申请。
int00
radiuspoi召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。int5001000
ak用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key” 申请akstringE4805d16520de693a3fe70
sn若用户所用ak的校验方式为sn校验时该参数必须 
sn生成
string 
output输出格式为json或者xmlstringjson或xmlxml
callback将json格式的返回值通过callback函数返回以实现jsonp功能stringcallback=showLocation(JavaScript函数名)
extensions_poi区别于pois参数,pois=0,不召回pois数据,但后端仍访问poi相应服务;extensions_poi=null时,后端不调用poi相关服务,可减少服务访问时延。
注意:若需访问海外POI,需申请「逆地理编码海外POI」服务权限,请提交工单申请。
stringnull
extensions_road当取值为true时,召回坐标周围最近的3条道路数据。区别于行政区划中的street参数(street参数为行政区划中的街道,和普通道路不对应)。stringfalse、truefalse
extensions_town当取值为true时,行政区划返回乡镇级数据(仅国内召回乡镇数据)。默认不访问。stringtrue
language指定召回的新政区划语言类型。
召回行政区划语言list(全量支持的语言见示例)。
当language=local时,根据请求中坐标所对应国家的母语类型,自动选择对应语言类型的行政区划召回。
目前支持多语言的行政区划区划包含country、provence、city、district
注意:多语言需申请「逆地理编码海外POI」服务权限,请提交工单申请。
stringel 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」服务权限,请提交工单申请。
int0、1
latest_admin是否访问最新版行政区划数据(仅对中国数据生效),1(访问),0(不访问)int0、10
 
返回结果参数
名称含义类型
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
namepoi名称string
poiTypepoi类型,如’ 办公大厦,商务大厦’string
pointpoi坐标{x,y}float
tel电话int
uidpoi唯一标识string
zip邮编int
parent_poipoi对应的主点poi(如,海底捞的主点为上地华联,该字段则为上地华联的poi信息。如无,该字段为空),包含子字段和pois基础召回字段相同。 
poiRegionsdirection_desc请求中的坐标与所归属区域面的相对位置关系string
name归属区域面名称string
tag归属区域面类型string
sematic_description当前位置结合POI的语义化结果描述。string
cityCode百度定义的城市id(正常更新与维护,但建议使用adcode)int
 
服务状态码
返回码英文描述定义常见原因
0ok正常服务请求正常召回
1 服务器内部错误 
2Parameter Invalid请求参数非法必要参数拼写错误或漏传(如query和tag请求中均未传入)
3Verify Failure权限校验失败 
4Quota Failure配额校验失败服务当日调用次数已超限,请前往API控制台提升(请优先进行开发者认证
5AK Failureak不存在或者非法未传入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类获取位置信息-LMLPHP

05-10 16:28
查看更多