標籤:
看注釋解析基本上OK了。
布局,許可權:
<!--用於進行網路定位--> <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>
<meta-data android:name="com.amap.api.v2.apikey" android:value="你的key"/><service android:name="com.amap.api.location.APSService"></service>
<com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/my_location"> </com.amap.api.maps.MapView>
public class MainActivity extends AppCompatActivity implements LocationSource,AMapLocationListener { private AMap aMap; private OnLocationChangedListener mListener; private MapView mMapView; //聲明AMapLocationClient類對象 public AMapLocationClient mapLocationClient; //聲明AMapLocationClientOption對象 public AMapLocationClientOption mapLocationClientOption; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().hide(); setContentView(R.layout.activity_main); mMapView = (MapView)findViewById(R.id.map); //在activity執行onCreate時執行mMapView.onCreate(savedInstanceState),實現地圖生命週期管理 mMapView.onCreate(savedInstanceState); if (aMap==null){ aMap = mMapView.getMap(); } aMap.setLocationSource(this);// 設定定位監聽 aMap.getUiSettings().setMyLocationButtonEnabled(true);// 設定預設定位按鈕是否顯示 // 設定為true表示顯示定位層並可觸發定位,false表示隱藏定位層並不可觸發定位,預設是false aMap.setMyLocationEnabled(true); // 設定定位的類型為定位元模式 ,可以由定位、跟隨或地圖根據面向方向旋轉幾種 aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mMapView.onDestroy(); mapLocationClient.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 onStop() { super.onStop(); mapLocationClient.stopLocation(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),實現地圖生命週期管理 mMapView.onSaveInstanceState(outState); } @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation!=null){ if (aMapLocation.getErrorCode()==0){ mListener.onLocationChanged(aMapLocation);// 顯示系統小藍點 StringBuilder stringBuilder = new StringBuilder(); //定位成功回調資訊,設定相關訊息 int type = aMapLocation.getLocationType(); String address = aMapLocation.getAddress(); stringBuilder.append(type+address); Toast.makeText(this,stringBuilder.toString(),Toast.LENGTH_SHORT).show(); }else { //顯示錯誤資訊ErrCode是錯誤碼,errInfo是錯誤資訊,詳見下方錯誤碼錶。 Log.i("erro info:",aMapLocation.getErrorCode()+"---"+aMapLocation.getErrorInfo()); } } } //啟用定位 @Override public void activate(OnLocationChangedListener onLocationChangedListener) { mListener = onLocationChangedListener; if (mapLocationClient==null){ //初始化AMapLocationClient,並綁定監聽 mapLocationClient = new AMapLocationClient(getApplicationContext()); //初始化定位參數 mapLocationClientOption = new AMapLocationClientOption(); //設定定位精度 mapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //是否返回地址資訊 mapLocationClientOption.setNeedAddress(true); //是否只定位一次 mapLocationClientOption.setOnceLocation(false); //設定是否強制重新整理WIFI,預設為強制重新整理 mapLocationClientOption.setWifiActiveScan(true); //是否允許類比位置 mapLocationClientOption.setMockEnable(false); //定位時間間隔 mapLocationClientOption.setInterval(2000); //給定位用戶端對象設定定位參數 mapLocationClient.setLocationOption(mapLocationClientOption); //綁定監聽 mapLocationClient.setLocationListener(this); //開啟定位 mapLocationClient.startLocation(); } } //停止定位 @Override public void deactivate() { mListener = null; if (mapLocationClient!=null){ mapLocationClient.stopLocation(); mapLocationClient.onDestroy(); } mapLocationClient = null; } /** 0 定位成功。 1 一些重要參數為空白,如context;請對定位傳遞的參數進行非空判斷。 2 定位失敗,由於僅掃描到單個wifi,且沒有基站資訊。 3 擷取到的請求參數為空白,可能擷取過程中出現異常。 4 請求伺服器過程中的異常,多為網路情況差,鏈路不通導致,請檢查裝置網路是否通暢。 5 返回的XML格式錯誤,解析失敗。 6 定位服務返回定位失敗,如果出現該異常,請將errorDetail資訊通過[email protected]反饋給我們。 7 KEY建權失敗,請仔細檢查key綁定的sha1值與apk簽名sha1值是否對應。 8 Android exception通用錯誤,請將errordetail資訊通過[email protected]反饋給我們。 9 定位初始化時出現異常,請重新啟動定位。 10 定位用戶端啟動失敗,請檢查AndroidManifest.xml檔案是否配置了APSService定位服務 11 定位時的基站資訊錯誤,請檢查是否安裝SIM卡,裝置很有可能連入了偽基站網路。 12 缺少定位許可權,請在裝置的設定中開啟app的定位許可權。 **/}
Android高德地圖的定位