📖第3章 初始化定位并顯示小藍點
- ?第1步:配置AndroidManifest.xml
- ?第2步:設置定位藍點
- ?第3步:初始化定位
- ?完整代碼
?第1步:配置AndroidManifest.xml
- 在application標簽下聲明
Service
組件
<service android:name="com.amap.api.location.APSService"></service>
- 聲明權限
<!--地圖相關--><uses-permission android:name="android.permission.INTERNET" /> <!-- 訪問網絡--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 網絡定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- GPS定位 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 訪問WiFi網絡定位 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 獲取wifi權限,進行網絡定位 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!-- 用于讀數據 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于寫入緩存數據到擴展存儲卡 --><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 用于申請調用A-GPS模塊 --><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 如果設置了target >= 28 如果需要啟動后臺定位則必須聲明這個權限 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--允許程序獲取網絡狀態-->
- 設置高德Key,在上一步顯示地圖時已經完成
<meta-data android:name="com.amap.api.v2.apikey" android:value="key">//開發者申請的key </meta-data>
?第2步:設置定位藍點
//設置了定位的監聽aMap.setLocationSource(this);//初始化定位藍點樣式類MyLocationStyle myLocationStyle;myLocationStyle = new MyLocationStyle();myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);//設置定位模式myLocationStyle.interval(2000); //只在連續定位模式下生效myLocationStyle.showMyLocation(true);//設置是否顯示定位小藍點// 將定位藍點移動到屏幕中心myLocationStyle.anchor(0.5f, 0.5f).myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);aMap.setMyLocationStyle(myLocationStyle);aMap.setMyLocationEnabled(true);// 是否啟動顯示定位藍點,默認是false
如果你不想顯示藍點精度圓圈,可以參考下面設置:
myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));//設置定位藍點精度圓圈的邊框顏色:無色myLocationStyle.radiusFillColor(Color.argb(0, 255, 255, 255)); // 設置精度圓圈背景色:透明無色
?第3步:初始化定位
- 實現
LocationSource
和AMapLocationListener
接口,重寫activate
、deactivate
和onLocationChanged
方法。
@Overridepublic void activate(OnLocationChangedListener onLocationChangedListener) {}@Overridepublic void deactivate() {}@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {}
- 在
activate
中實現定位激活。
private OnLocationChangedListener mListener;//聲明位置監聽private AMapLocationClient mlocationClient;//聲明定位客戶端private AMapLocationClientOption mLocationOption;//聲明定位參數配置選項/*** 激活定位*/@Overridepublic void activate(LocationSource.OnLocationChangedListener listener) {mListener = listener;if (mlocationClient == null) {//初始化定位try {mLocationOption = new AMapLocationClientOption();//初始化定位參數mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//設置為高精度定位模式mlocationClient = new AMapLocationClient(this);//聲明定位客戶端mlocationClient.setLocationListener(this);//設置定位回調監聽mlocationClient.setLocationOption(mLocationOption);//設置定位參數mlocationClient.startLocation();//啟動定位} catch (Exception e) {throw new RuntimeException(e);}}}
- 在
deactivate
中實現停止定位。
/*** 停止定位*/@Overridepublic void deactivate() {mListener = null;if (mlocationClient != null) {mlocationClient.stopLocation();mlocationClient.onDestroy();}mlocationClient = null;}
- 在
onLocationChanged
中監聽定位回調。
private boolean isFirstLoc = true;//判斷是否第一次定位private LatLng currentLatLng;//當前定位/*** 監聽定位回調* @param aMapLocation*/@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (mListener != null && aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {//定位成功回調信息,設置相關消息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(16));//設置縮放級別currentLatLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()); //獲取當前定位aMap.moveCamera(CameraUpdateFactory.changeLatLng(currentLatLng));//移動到定位點//點擊定位按鈕 能夠將地圖的中心移動到定位點mListener.onLocationChanged(aMapLocation);isFirstLoc = false;}} else {//顯示錯誤信息Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}
**注意:**檢查是否開啟了應用定位權限和高精度定位
?完整代碼
MainActivity類:
package com.st.demo;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.MapsInitializer;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MyLocationStyle;
import java.text.SimpleDateFormat;
import java.util.Date;public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener {private MapView mMapView;//聲明一個地圖視圖對象private AMap aMap;//聲明一個地圖圖層private OnLocationChangedListener mListener;//聲明位置監聽private AMapLocationClient mlocationClient;//聲明定位客戶端private AMapLocationClientOption mLocationOption;//聲明定位參數配置選項private boolean isFirstLoc = true;//判斷是否第一次定位private LatLng currentLatLng;//當前定位@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化地圖定位initMap(savedInstanceState);}/*** 初始化地圖* @param savedInstanceState*/private void initMap(Bundle savedInstanceState) {//隱私合規接口MapsInitializer.updatePrivacyShow(this, true, true);MapsInitializer.updatePrivacyAgree(this, true);AMapLocationClient.updatePrivacyAgree(this, true);AMapLocationClient.updatePrivacyShow(this, true, true);//獲取地圖視圖對象mMapView = findViewById(R.id.map);//創建地圖mMapView.onCreate(savedInstanceState);if (aMap == null) {aMap = mMapView.getMap();}//設置了定位的監聽aMap.setLocationSource(this);//初始化定位藍點樣式類MyLocationStyle myLocationStyle;myLocationStyle = new MyLocationStyle();myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);//設置定位模式myLocationStyle.interval(2000); //只在連續定位模式下生效myLocationStyle.showMyLocation(true);//設置是否顯示定位小藍點// 將定位藍點移動到屏幕中心myLocationStyle.anchor(0.5f, 0.5f).myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);aMap.setMyLocationStyle(myLocationStyle);aMap.setMyLocationEnabled(true);// 是否啟動顯示定位藍點,默認是false。}/*** 激活定位*/@Overridepublic void activate(LocationSource.OnLocationChangedListener listener) {mListener = listener;if (mlocationClient == null) {//初始化定位try {mLocationOption = new AMapLocationClientOption();//初始化定位參數mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//設置為高精度定位模式mlocationClient = new AMapLocationClient(this);//聲明定位客戶端mlocationClient.setLocationListener(this);//設置定位回調監聽mlocationClient.setLocationOption(mLocationOption);//設置定位參數mlocationClient.startLocation();//啟動定位} catch (Exception e) {throw new RuntimeException(e);}}}/*** 停止定位*/@Overridepublic void deactivate() {mListener = null;if (mlocationClient != null) {mlocationClient.stopLocation();mlocationClient.onDestroy();}mlocationClient = null;}/*** 監聽定位回調* @param aMapLocation*/@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (mListener != null && aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {//定位成功回調信息,設置相關消息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(16));//設置縮放級別currentLatLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()); //獲取當前定位aMap.moveCamera(CameraUpdateFactory.changeLatLng(currentLatLng));//移動到定位點//點擊定位按鈕 能夠將地圖的中心移動到定位點mListener.onLocationChanged(aMapLocation);isFirstLoc = false;}} else {//顯示錯誤信息Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}/*** 生命周期-onDestroy*/@Overrideprotected void onDestroy() {super.onDestroy();mMapView.onDestroy(); //銷毀地圖}/*** 生命周期-onResume*/@Overrideprotected void onResume() {super.onResume();mMapView.onResume(); //重新繪制加載地圖}/*** 生命周期-onPause*/@Overrideprotected void onPause() {super.onPause();mMapView.onPause();//暫停地圖的繪制}/*** 生命周期-onSaveInstanceState*/@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mMapView.onSaveInstanceState(outState);//保存地圖當前的狀態}
}
activity_main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"></com.amap.api.maps.MapView></LinearLayout>
AndroidManifest.xml中的權限相關省略,參考上面的。
?第1,2章 Android搭建3D高德地圖詳細教
?第 3 章 初始化定位并顯示小藍點
?第 4 章Android高德地圖繪制標記點Marker
?第 5 章Android高德地圖控件交互詳細介紹