Android實現高德地圖定位詳細流程
阿新 • • 發佈:2018-10-31
要實現高德地圖定位呢,首先需要做好以下幾步準備:
如果你嫌筆者寫的不好或者懶得看,只需要程式碼的話,請選擇:github:點選開啟連結,此連線可能和文章內容有所出入,因為我可能會做後期的開發使用。(會更新)CSDN:點選開啟連結下載ZIP壓縮檔案 當然,可以把程式碼下載下來,邊看程式碼,邊看教程。應該更好理解。
1. 在高德開放平臺註冊帳號註冊地址:http://lbs.amap.com 註冊之後選擇您需要的SDK(此處用到的是地圖和定位SDK)。
此處有開發文件,定位所需要的架包等等。
如果你只需要實現簡單的定位功能
可以點選下載.
定位架包:http://download.csdn.net/detail/android_msk/9855133地圖架包:http://download.csdn.net/detail/android_msk/9855108
2.申請自己的KEY(作為開發谷歌地圖的鑰匙)
點選申請key裡面有詳細的教程,在此就不再囉嗦。 3:新增jar包,將jar包放入工程的libs目錄下。
對於每個jar檔案,右鍵-選擇Add As Library,匯入到工程中。或者使用選單欄 選擇 File ->Project Structure->Modules-> Dependencies。點選綠色的加號選擇File dependency. 然後選擇要新增的jar包即可,此時build.gradle中會自動生成如下資訊。
dependencies {<!--此標籤--> compile files('libs/AMap_Location_V3.4.0_20170427.jar') compile files('libs/Amap_2DMap_V4.2.0_20170209.jar') }
4.在安卓端顯示谷歌地圖
第一步:新增使用者key 在工程的“ AndroidManifest.xml ”檔案的application標籤下新增如下程式碼。
第二步:新增所需許可權 在工程的“ AndroidManifest.xml ”檔案中進行新增。 (上面是基礎包,定位是後面的,不過肯定不是為了做地圖的,嘿嘿,在這裡直接粘出來)<meta-data android:name="com.amap.api.v2.apikey" android:value="你申請的key" /> <!--擁有一個屬於自己的key便於開發使用-->
//地圖包、搜尋包需要的基礎許可權 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--用於進行網路定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--用於訪問GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!--用於提高GPS定位速度--> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!--寫入擴充套件儲存,向擴充套件卡寫入資料,用於寫入快取定位資料--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--讀取快取資料--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!--用於讀取手機當前的狀態--> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
第三步:在layout中的XML檔案中新增地圖控制元件
第四步,在Activity中管理地圖生命週期。<com.amap.api.maps2d.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" />
地圖部分已經完成。你可以試試效果。 5.實現定位功能 第一步: 配置AndroidManifest.xmlpublic class MainActivity extends Activity { private MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取地圖控制元件引用 mMapView = (MapView) findViewById(R.id.map_view); //在activity執行onCreate時執行mMapView.onCreate(savedInstanceState),實現地圖生命週期管理 mMapView.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView.onResume (),實現地圖生命週期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView.onPause (),實現地圖生命週期管理 mMapView.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),實現地圖生命週期管理 mMapView.onSaveInstanceState(outState); } }
1.在application標籤中宣告service元件,每個app擁有自己單獨的定位service。(就新增在你的key標籤)
2.配置許可權。在上面地圖許可權就含有<service android:name="com.amap.api.location.APSService"/>
第二步:啟動定位功能
1. 在主執行緒中獲得地圖物件AMap,並設定定位監聽且實現LocationSource介面:
2.定義相關變數public class MainActivity extends AppCompatActivity implements LocationSource,AMapLocationListener 實現其中的方法。
3.在主函式中啟動private AMap aMap; //宣告AMapLocationClient類物件,定位發起端 private AMapLocationClient mLocationClient = null; //宣告mLocationOption物件,定位引數 public AMapLocationClientOption mLocationOption = null; //宣告mListener物件,定位監聽器 private OnLocationChangedListener mListener = null; //標識,用於判斷是否只顯示一次定位資訊和使用者重新定位 private boolean isFirstLoc = true;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取地圖控制元件引用 mMapView = (MapView) findViewById(R.id.map_view); //在activity執行onCreate時執行mMapView.onCreate(savedInstanceState),實現地圖生命週期管理 mMapView.onCreate(savedInstanceState); if (aMap == null) { aMap = mMapView.getMap(); //設定顯示定位按鈕 並且可以點選 UiSettings settings = aMap.getUiSettings(); aMap.setLocationSource(this);//設定了定位的監聽 // 是否顯示定位按鈕 settings.setMyLocationButtonEnabled(true); aMap.setMyLocationEnabled(true);//顯示定位層並且可以觸發定位,預設是flase } //開始定位 location(); } private void location() { //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //設定定位回撥監聽 mLocationClient.setLocationListener(this); //初始化定位引數 mLocationOption = new AMapLocationClientOption(); //設定定位模式為Hight_Accuracy高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅裝置模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //設定是否返回地址資訊(預設返回地址資訊) mLocationOption.setNeedAddress(true); //設定是否只定位一次,預設為false mLocationOption.setOnceLocation(false); //設定是否強制重新整理WIFI,預設為強制重新整理 mLocationOption.setWifiActiveScan(true); //設定是否允許模擬位置,預設為false,不允許模擬位置 mLocationOption.setMockEnable(false); //設定定位間隔,單位毫秒,預設為2000ms,最低1000ms。 mLocationOption.setInterval(1000); //關閉快取機制 mLocationOption.setLocationCacheEnable(false); //設定setOnceLocationLatest(boolean b)介面為true,啟動定位時SDK會返回最近3s內精度最高的一次定位結果 mLocationOption.setOnceLocationLatest(true); //給定位客戶端物件設定定位引數 mLocationClient.setLocationOption(mLocationOption); //啟動定位 mLocationClient.startLocation(); }
4.在onLocationChanged中新增獲取的引數
@Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { if (aMapLocation.getErrorCode() == 0) { //可在其中解析amapLocation獲取相應內容。 aMapLocation.getLocationType();//獲取當前定位結果來源,如網路定位結果,詳見官方定位型別表 aMapLocation.getLatitude();//獲取緯度 aMapLocation.getLongitude();//獲取經度 aMapLocation.getAccuracy();//獲取精度資訊 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(aMapLocation.getTime()); df.format(date);//定位時間 aMapLocation.getAddress();//地址,如果option中設定isNeedAddress為false,則沒有此結果,網路定位結果中會有地址資訊,GPS定位不返回地址資訊。 aMapLocation.getCountry();//國家資訊 aMapLocation.getProvince();//省資訊 aMapLocation.getCity();//城市資訊 aMapLocation.getDistrict();//城區資訊 aMapLocation.getStreet();//街道資訊 aMapLocation.getStreetNum();//街道門牌號資訊 aMapLocation.getCityCode();//城市編碼 aMapLocation.getAdCode();//地區編碼 // 如果不設定標誌位,此時再拖動地圖時,它會不斷將地圖移動到當前的位置 if (isFirstLoc) { //設定縮放級別 aMap.moveCamera(CameraUpdateFactory.zoomTo(17)); //將地圖移動到定位點 aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()))); //點選定位按鈕 能夠將地圖的中心移動到定位點 mListener.onLocationChanged(aMapLocation); //新增圖釘 // aMap.addMarker(getMarkerOptions(amapLocation)); //獲取定位資訊 StringBuffer buffer = new StringBuffer(); buffer.append(aMapLocation.getCountry() + "" + aMapLocation.getProvince() + "" + aMapLocation.getCity() + "" + aMapLocation.getProvince() + "" + aMapLocation.getDistrict() + "" + aMapLocation.getStreet() + "" + aMapLocation.getStreetNum()); Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show(); isFirstLoc = false; } }else { //定位失敗時,可通過ErrCode(錯誤碼)資訊來確定失敗的原因,errInfo是錯誤資訊,詳見錯誤碼錶。 Log.e("AmapError","location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo()); } } }
5.停止定位(在onDestroy方法中新增,新增後如下)
至此,基於谷歌地圖定位功能已經可以實現。 基礎效果圖:@Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mMapView.onDestroy(); mLocationClient.stopLocation();//停止定位 mLocationClient.onDestroy();//銷燬定位客戶端。 }
如果此教程對你有用的話,歡迎點贊。有什麼問題可以留言,或者聯絡我!