第二十三篇 Android通過原生Api獲取經緯度以及百度定位注意點
阿新 • • 發佈:2019-01-29
Android通過原生Api獲取經緯度:
原生定位API只能定位到經緯度,但是如果要定位具體的地址,則需要將經緯度資訊傳送到谷歌伺服器,進行反向地理位置解析,因為目前
國內無法連線谷歌伺服器,所以使用原生定位API就不合適了,而且百度定位的功能多又強,非常適合用來定位以及獲取地圖等.
工具類:
public class LocationUtils { private static Context mContext; private static LocationUtils mInstance; public static final String TAG = "LocationUtils"; private LocationUtils(Context mContext) { this.mContext = mContext; } public static LocationUtils getInstance(Context context){ if (mInstance == null){ synchronized (LocationUtils.class){ if (mInstance == null){ mInstance = new LocationUtils(context); mContext = context; } } initLocation(); } return mInstance; } static LocationManager locationManager; static Location location; static String provider; public static void initLocation() { locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); // 獲取所有可用的位置提供器 List<String> providerList = locationManager.getProviders(true); if (providerList.contains(LocationManager.GPS_PROVIDER)) { provider = LocationManager.GPS_PROVIDER; } else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) { provider = LocationManager.NETWORK_PROVIDER; } else { // 當沒有可用的位置提供器時,彈出Toast提示使用者 Toast.LENGTH_SHORT).show(); LogUtil.d(TAG,"No location provider to use"); return; } location = locationManager.getLastKnownLocation(provider); /*if (location != null) { // 顯示當前裝置的位置資訊 showLocation(location); }*/ locationManager.requestLocationUpdates(provider, 5000, 1, locationListener); } /** * 獲取位置資訊 * @return */ public static Map<String, String> getLocation() { return showLocation(location); } public static Map<String, String> showLocation(Location location) { if(location == null)return null; Map<String, String> map = new HashMap<>(); map.put("longitude", String.valueOf(location.getLongitude())); map.put("latitude", String.valueOf(location.getLatitude())); return map; } public static LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // 更新當前裝置的位置資訊 showLocation(location); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; public void remove() { if (locationManager != null) { // 關閉程式時將監聽器移除 locationManager.removeUpdates(locationListener); } } }
百度定位:
如果需要使用百度定位,請到http://lbsyun.baidu.com/location/ 上去選擇定位服務,百度定位SDK版本為 v7.3,只需要選擇功能開發包 下載-->>選擇全量定位功能,點選開發包下載即可,大小隻有733kb. **使用百度定位:** 1.建立應用-->>Android SDK... 2.獲取開發版和正式版SHA1方法: 1).正式版SHA1獲取: 開啟cmd,輸入:keytool -list -v -keystore E:\use-by-me.jks(不需要定位到檔案所在位置) 然後輸入自己建立jks數字簽名時的密碼 這裡是:123456 2).開發版SHA1獲取: cmd命令(進入.android資料夾下):cd C:\Users\Administrator\.android 輸入:keytool -list -v -keystore debug.keystore 注意:密碼為 android **注意點:** 1)當您選擇使用v4.0及之後版本的定位SDK時,需要先申請且配置AK,並在程式相應位置填寫您的AK。(選擇使用v3.3及之前版本SDK 的開發者,不需要使用AK). 2)每個AK僅且唯一對於1個應用驗證有效. 3)若您需要在同一個工程中同時使用Android定位SDK和Android地圖SDK,可以使用同一個AK. 4)Android定位SDK提供了多種CPU架構的so檔案(jar通用,只有一個),所以會出現armeabi、arm64-v8a、armeabi-v7a、 x86、x86_64看起來名稱一樣重複的.so檔案,其實是為了支援多種CPU而準備的。但是BaiduLBS_Android.jar這個jar檔案只有一個, 所以只要將下載的全量定位功能開發包中所有的so以及jar放到工程libs目錄下即可。 5)使用帶有室內精準定位的SDK版本時,需增加整合庫檔案libindoor.so. 6)新版本的定位SDK,開發者除了要更新jar包之外,同時需要關注so檔案是否有更新。如果so檔名稱改變,即so檔案有更新,開發者 要及時替換掉老版本,否則會導致定位失敗. 7)室內外網定位成功,室內內網定位失敗.