Android開發項目時常常會遇到定位這個功能, 很久以前寫過一篇了,官方也更新了一些東西,我也更新下
以前使用的是jar包 導入來實現高德定位
老版本 鏈接:https://www.cnblogs.com/zhangqie/p/6438400.html
現在通過Gradle集成SDK(也可以使用jar包)
//定位依賴 implementation 'com.amap.api:location:latest.integration'
之后到高德申請key值,登錄打開控制台 點擊創建應用,如圖:
填寫相應信息,
名稱,PackageName:項目的包名,至於SHA1安全碼可以這樣獲取,可以 Window+R 打開控制台 輸入cmd點擊確定
之后在彈框中完成以下操作就可以看到SHA1安全碼了
上圖的密鑰庫口令默認的是:android (注:輸入口令是看不見的,輸入完成Enter即可)
以上是測試版獲取SHA1,發布版SHA1獲取請看博客 Android Studio apk打包,keystore.jks文件生成,根據keystore密鑰獲取SHA1安全碼
輸入完信息確定就可以看到key值了
AndroidManifest.xml中加入權限
<!--用於進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!--用於訪問GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!--用於獲取運營商信息,用於支持提供運營商信息相關的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!--用於訪問wifi網絡信息,wifi信息會用於進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!--用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!--用於訪問網絡,網絡定位需要上網--> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <!--用於讀取手機當前的狀態--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!--用於寫入緩存數據到擴展存儲卡--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!--用於申請調用A-GPS模塊--> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission> <!--用於申請獲取藍牙信息進行室內定位--> <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
<application>標簽中添加Key值信息
<service android:name="com.amap.api.location.APSService"></service> <meta-data android:name="com.amap.api.v2.apikey" android:value="2ca77496c8ae6b92cef9e15dfd68b87b"> </meta-data>
Activity代碼:(和以前的相比少了很多不必要的代碼)
/*** * 定位 */ private void showLocation() { try { mlocationClient = new AMapLocationClient(this); mLocationOption = new AMapLocationClientOption(); mlocationClient.setLocationListener(this); //設置定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅設備模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); mLocationOption.setInterval(5000); //設置定位參數 mlocationClient.setLocationOption(mLocationOption); //啟動定位 mlocationClient.startLocation(); } catch (Exception e) { } } @Override public void onLocationChanged(AMapLocation amapLocation) { try { if (amapLocation != null) { if (amapLocation.getErrorCode() == 0) { //定位成功回調信息,設置相關消息 //獲取當前定位結果來源,如網絡定位結果,詳見定位類型表 Log.i("定位類型", amapLocation.getLocationType() + ""); Log.i("獲取緯度", amapLocation.getLatitude() + ""); Log.i("獲取經度", amapLocation.getLongitude() + ""); Log.i("獲取精度信息", amapLocation.getAccuracy() + ""); //如果option中設置isNeedAddress為false,則沒有此結果,網絡定位結果中會有地址信息,GPS定位不返回地址信息。 Log.i("地址", amapLocation.getAddress()); Log.i("國家信息", amapLocation.getCountry()); Log.i("省信息", amapLocation.getProvince()); Log.i("城市信息", amapLocation.getCity()); Log.i("城區信息", amapLocation.getDistrict()); Log.i("街道信息", amapLocation.getStreet()); Log.i("街道門牌號信息", amapLocation.getStreetNum()); Log.i("城市編碼", amapLocation.getCityCode()); Log.i("地區編碼", amapLocation.getAdCode()); Log.i("獲取當前定位點的AOI信息", amapLocation.getAoiName()); Log.i("獲取當前室內定位的建築物Id", amapLocation.getBuildingId()); Log.i("獲取當前室內定位的樓層", amapLocation.getFloor()); Log.i("獲取GPS的當前狀態", amapLocation.getGpsAccuracyStatus() + ""); //獲取定位時間 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(amapLocation.getTime()); Log.i("獲取定位時間", df.format(date)); // 停止定位 mlocationClient.stopLocation(); } else { //定位失敗時,可通過ErrCode(錯誤碼)信息來確定失敗的原因,errInfo是錯誤信息,詳見錯誤碼表。 Log.e("AmapError", "location Error, ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo()); } } } catch (Exception e) { } } @Override protected void onStop() { super.onStop(); // 停止定位 if (null != mlocationClient) { mlocationClient.stopLocation(); } } /** * 銷毀定位 */ private void destroyLocation() { if (null != mlocationClient) { /** * 如果AMapLocationClient是在當前Activity實例化的, * 在Activity的onDestroy中一定要執行AMapLocationClient的onDestroy */ mlocationClient.onDestroy(); mlocationClient = null; } } @Override protected void onDestroy() { destroyLocation(); super.onDestroy(); }
運行得到日志:
代碼地址Github :https://github.com/DickyQie/android-map