Android 使用GPS獲取到經緯度後 沒法在Android8.0上使用Geocoder類獲取位置信息

因爲個人應用在獲取到經緯度後在Android8.0不能使用以下代碼獲取位置信息。只好使用百度地圖 WEB服務API 經過調接口的方式獲取位置信息。php

Geocoder geocoder = new Geocoder(context, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);

 

首先須要有百度開發者帳戶,以便獲取key/ak,這個很簡單略過。請求地址:git

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爲參數中經緯度座標類型,默認爲百度的座標類型。web

 官方文檔  請仔細查看官方文檔json

 

請求參數
參數名 參數含義 類型 舉例 默認值 是否必須
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 api

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;
    }
}

 

 

相關文章
相關標籤/搜索