一、 要實作高德地圖定位呢,首先需要做好以下幾步準備:
1. 在高德開放平台注冊帳号
注冊位址:http://lbs.amap.com
2. 在開發中下載下傳Android平台下的地圖SDK和定位SDK檔案
進入相關下載下傳下載下傳自己想要的功能或檔案,圖隻是截取了地圖SDK的頁面,定位SDK也是一樣,按自己想要的檔案下載下傳。下載下傳完成後解壓得到:
- 3D地圖包解壓後得到:3D地圖顯示包“AMap_3DMap_VX.X.X_時間.jar”和庫檔案夾(包含armeabi、arm64-v8a等庫檔案)。
- 2D地圖包解壓後得到:2D地圖顯示包“AMap_2DMap_VX.X.X_時間.jar ”
- 定位SDK下載下傳并解壓得到定位包“AMap_Location_V2.x.x.jar“
3. 添加jar包,将jar包放入工程的libs目錄下。
對于每個jar檔案,右鍵-選擇Add As Library,導入到工程中。或者使用菜單欄 選擇 File ->Project Structure->Modules-> Dependencies。點選綠色的加号選擇File dependency. 然後選擇要添加的jar包即可,此時build.gradle中會自動生成如下資訊。
4. 申請API KEY
進入控制台
建立自己的應用(建立過程内需要的SHA1已經的部落格講過)
開發環境已經配置好了,接下來就是敲代碼了。
二、 首先我們要做的就是将地圖顯示出來,通過以下幾步操作,即可在應用中使用高德地圖SDK:
第一步:添加使用者key 在工程的“ AndroidManifest.xml ”檔案如下代碼中添加您的使用者 Key。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="c9df032baec3ec50b1e089768ea4672b" />
第二步:添加所需權限 在工程的“ AndroidManifest.xml ”檔案中進行添加。
//地圖包、搜尋包需要的基礎權限
<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_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
第三步:在布局xml檔案中添加地圖控件。
<com.amap.api.maps2d.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
第四步,建立地圖Activity,管理地圖生命周期。
public 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);
}
}
注意:一定要有
mMapView.onCreate(savedInstanceState);
運作一下,效果如下:
三、接下來就是實作定位了,定位也需要通過以下幾步操作完成:
第一步:配置AndroidManifest.xml
1.在application标簽中聲明service元件,每個app擁有自己單獨的定位service。
2.接下來聲明使用權限
<!--用于進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于通路GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--擷取營運商資訊,用于支援提供營運商資訊相關的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--用于通路wifi網絡資訊,wifi資訊會用于進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--這個權限用于擷取wifi的擷取權限,wifi資訊會用來進行網絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--用于通路網絡,網絡定位需要上網-->
<uses-permission android:name="android.permission.INTERNET" />
<!--用于讀取手機目前的狀态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--寫入擴充存儲,向擴充卡寫入資料,用于寫入緩存定位資料-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
第二步:啟動定位功能:
1. 在主線程中獲得地圖對象AMap,并設定定位監聽且實作LocationSource接口:
if (aMap == null) {
aMap = mMapView.getMap();
//設定顯示定位按鈕 并且可以點選
UiSettings settings = aMap.getUiSettings();
aMap.setLocationSource(this);//設定了定位的監聽,這裡要實作LocationSource接口
// 是否顯示定位按鈕
settings.setMyLocationButtonEnabled(true);
aMap.setMyLocationEnabled(true);//顯示定位層并且可以觸發定位,預設是flase
}
2. 配置定位參數,啟動定位
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//設定定位回調監聽,這裡要實作AMapLocationListener接口,AMapLocationListener接口隻有onLocationChanged方法可以實作,用于接收異步傳回的定位結果,參數是AMapLocation類型。
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
mLocationOption.setInterval();
//給定位用戶端對象設定定位參數
mLocationClient.setLocationOption(mLocationOption);
//啟動定位
mLocationClient.startLocation();
- 高精度定位模式:
在這種定位模式下,将同時使用高德網絡定位和GPS定位,優先傳回精度高的定位
- 低功耗定位模式:
在這種模式下,将隻使用高德網絡定位
- 僅裝置定位模式:
在這種模式下,将隻使用GPS定位。 3. 實作AMapLocationListener接口,擷取定位結果:
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == ) {
//定位成功回調資訊,設定相關消息
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());
//将地圖移動到定位點
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
//點選定位按鈕 能夠将地圖的中心移動到定位點
mListener.onLocationChanged(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());
Toast.makeText(getApplicationContext(), "定位失敗", Toast.LENGTH_LONG).show();
}
}
}
4.關于停止定位
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
//mLocationClient.stopLocation();//停止定位
mLocationClient.onDestroy();//銷毀定位用戶端。
//銷毀定位用戶端之後,若要重新開啟定位請重新New一個AMapLocationClient對象。
}
//激活定位
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
}
@Override
public void deactivate() {
mListener = null;
}
源碼位址:http://download.csdn.net/detail/mr_wzc/9532367