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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM