-
創(chuàng)建應(yīng)用
進(jìn)入高德控制臺(tái)后,點(diǎn)擊“創(chuàng)建應(yīng)用”按鈕伺帘,進(jìn)入創(chuàng)建應(yīng)用的界面伪嫁。 填上你的應(yīng)用程序的名稱以及選擇應(yīng)用類型就可以了, 最后點(diǎn)擊最下方的 “創(chuàng)建”按鈕张咳,創(chuàng)建應(yīng)用完畢。
創(chuàng)建應(yīng)用1.png
創(chuàng)建應(yīng)用2.png
-
添加key
在我的應(yīng)用列表中點(diǎn)擊剛才創(chuàng)建的應(yīng)用的右邊的?號(hào)。
添加key1.png
填寫Key名稱考婴、包名以及選擇服務(wù)平臺(tái)。
添加key2.png
獲取發(fā)布版的SHA1(Mac電腦)
1.打開 終端
2.輸入keytool -list -v -keystore 然后把簽名文件直接拖進(jìn)控制臺(tái) 回車
3.輸入簽名的密碼
獲取簽名文件的SHA1.png
獲取debug的SHA1(Mac電腦)
1.打開 AndroidStudio的Terminal
2.輸入keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 回車
獲取debug的SHA1.png
-
集成key
高德 Key 配置到項(xiàng)目的 “AndroidManifest.xml” 文件中翘狱,添加如下代碼:
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="請(qǐng)輸入您的用戶Key"/>
……
</application>
-
下載jar包并集成
根據(jù)需要選擇功能.png
jar包復(fù)制到工程的 libs 目錄下并右鍵 Add As Library
集成.png
-
定位的使用
聲明Service組件
<service android:name="com.amap.api.location.APSService" />
聲明權(quán)限
<!--用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--用于獲取運(yùn)營(yíng)商信息漓糙,用于支持提供運(yùn)營(yíng)商信息相關(guān)的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--用于獲取wifi的獲取權(quán)限昆禽,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--用于訪問網(wǎng)絡(luò)蝗蛙,網(wǎng)絡(luò)定位需要上網(wǎng)-->
<uses-permission android:name="android.permission.INTERNET" />
<!--用于讀取手機(jī)當(dāng)前的狀態(tài)-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--用于寫入緩存數(shù)據(jù)到擴(kuò)展存儲(chǔ)卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--用于申請(qǐng)調(diào)用A-GPS模塊-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--用于申請(qǐng)獲取藍(lán)牙信息進(jìn)行室內(nèi)定位-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
初始化定位
/**
* 請(qǐng)?jiān)谥骶€程中聲明AMapLocationClient類對(duì)象捡硅,需要傳Context類型的參數(shù)
* 推薦用getApplicationContext()方法獲取全進(jìn)程有效的context
*/
// 聲明AMapLocationClient類對(duì)象
public AMapLocationClient mLocationClient = null;
// 初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//設(shè)置定位回調(diào)監(jiān)聽
mlocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
amapLocation.getLocationType();//獲取當(dāng)前定位結(jié)果來源盗棵,如網(wǎng)絡(luò)定位結(jié)果北发,詳見定位類型表
amapLocation.getLatitude();//獲取緯度
amapLocation.getLongitude();//獲取經(jīng)度
amapLocation.getAccuracy();//獲取精度信息
amapLocation.getAddress();//地址琳拨,如果option中設(shè)置isNeedAddress為false屯曹,則沒有此結(jié)果,網(wǎng)絡(luò)定位結(jié)果中會(huì)有地址信息僵井,GPS定位不返回地址信息驳棱。
amapLocation.getCountry();//國家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城區(qū)信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道門牌號(hào)信息
amapLocation.getCityCode();//城市編碼
amapLocation.getAdCode();//地區(qū)編碼
amapLocation.getAoiName();//獲取當(dāng)前定位點(diǎn)的AOI信息
amapLocation.getBuildingId();//獲取當(dāng)前室內(nèi)定位的建筑物Id
amapLocation.getFloor();//獲取當(dāng)前室內(nèi)定位的樓層
amapLocation.getGpsAccuracyStatus();//獲取GPS的當(dāng)前狀態(tài)
//獲取定位時(shí)間
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);
}else {
//定位失敗時(shí)社搅,可通過ErrCode(錯(cuò)誤碼)信息來確定失敗的原因,errInfo是錯(cuò)誤信息形葬,詳見錯(cuò)誤碼表笙以。
Log.e("AmapError","location Error, ErrCode:"+ amapLocation.getErrorCode() + ", errInfo:"+ amapLocation.getErrorInfo());
}
}
}
});
配置定位參數(shù)
// 初始化定位參數(shù)對(duì)象
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
/**
* 設(shè)置單次定位或連續(xù)定位 不設(shè)置默認(rèn)間隔2秒定位一次
*/
// 設(shè)置定位一次
mLocationOption.setOnceLocation(true);
// 設(shè)置連續(xù)定位,定位間隔,單位毫秒,默認(rèn)為2000ms拆祈,最低1000ms倘感。
mLocationOption.setInterval(1000);
/**
* 設(shè)置定位模式(三種模式) 不設(shè)置默認(rèn)高精度定位模式
*/
// 高精度定位模式:會(huì)同時(shí)使用網(wǎng)絡(luò)定位和GPS定位,優(yōu)先返回最高精度的定位結(jié)果淤年,以及對(duì)應(yīng)的地址描述信息蜡豹。
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 低功耗定位模式:不會(huì)使用GPS和其他傳感器,只會(huì)使用網(wǎng)絡(luò)定位(Wi-Fi和基站定位)豹休;
mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving);
// 僅用設(shè)備定位模式:不需要連接網(wǎng)絡(luò)桨吊,只使用GPS進(jìn)行定位凤巨,這種模式下不支持室內(nèi)環(huán)境的定位敢茁,需要在室外環(huán)境下才可以成功定位留美。注意,自 v2.9.0 版本之后逢倍,僅設(shè)備定位模式下支持返回地址描述信息景图。
mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors);
給定位客戶端對(duì)象設(shè)置定位參數(shù)并啟動(dòng)定位
mLocationClient.setLocationOption(mLocationOption);
// 啟動(dòng)定位
mLocationClient.startLocation();
-
2D地圖的使用
聲明權(quán)限
<!--允許程序打開網(wǎng)絡(luò)套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設(shè)置內(nèi)置sd卡的寫權(quán)限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網(wǎng)絡(luò)狀態(tài)-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問WiFi網(wǎng)絡(luò)信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序讀寫手機(jī)狀態(tài)和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允許程序訪問CellID或WiFi熱點(diǎn)來獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
布局xml文件中添加地圖控件
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
查找控件并對(duì)Map的生命周期進(jìn)行管理
public class MainActivity extends Activity {
MapView mMapView = null;
//初始化地圖控制器對(duì)象
AMap aMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity執(zhí)行onCreate時(shí)執(zhí)行mMapView.onCreate(savedInstanceState)挚币,創(chuàng)建地圖
mMapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mMapView.getMap();
}
}
@Override
protected void onResume() {
super.onResume();
//在activity執(zhí)行onResume時(shí)執(zhí)行mMapView.onResume (),重新繪制加載地圖
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執(zhí)行onPause時(shí)執(zhí)行mMapView.onPause ()慎玖,暫停地圖的繪制
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy()趁怔,銷毀地圖
mMapView.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity執(zhí)行onSaveInstanceState時(shí)執(zhí)行mMapView.onSaveInstanceState (outState)薪前,保存地圖當(dāng)前的狀態(tài)
mMapView.onSaveInstanceState(outState);
}
}
繪制標(biāo)記
// 聲明標(biāo)記
private Marker locationMarker;
/**
* 往地圖上添加marker
*/
private void addMarker(double latitude,double longitude) {
LatLng latLng = new LatLng(latitude, longitude);
if (locationMarker != null) {
// maker已存在直接更換經(jīng)緯度
locationMarker.setPosition(latLng);
// 縮放地圖
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20));
return;
}
MarkerOptions markerOptions = new MarkerOptions();
// 在地圖上標(biāo)記位置的經(jīng)緯度值。必填參數(shù)
markerOptions.position(latLng);
// 點(diǎn)標(biāo)記的標(biāo)題
markerOptions.title("長(zhǎng)按此標(biāo)記");
// 點(diǎn)標(biāo)記的內(nèi)容
markerOptions.snippet("可進(jìn)行拖動(dòng)");
// 點(diǎn)標(biāo)記是否可拖拽
markerOptions.draggable(true);
// 點(diǎn)標(biāo)記的錨點(diǎn)(不設(shè)置,默認(rèn)中心點(diǎn)) 根據(jù)圖片調(diào)節(jié)
markerOptions.anchor(0.5f, 1f);
// 圖標(biāo)不支持svg
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.gd_maker)));
// 地圖上添加標(biāo)記
locationMarker = aMap.addMarker(markerOptions);
// 縮放地圖
// 參數(shù)二:地圖縮放級(jí)別為4-20級(jí)
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20));
}
標(biāo)記拖拽監(jiān)聽
aMap.setOnMarkerDragListener(new AMap.OnMarkerDragListener() {
@Override
public void onMarkerDragStart(Marker marker) {
}
// 在marker拖動(dòng)過程中回調(diào)此方法, 這個(gè)marker的位置可以通過getPosition()方法返回例诀。
// 這個(gè)位置可能與拖動(dòng)的之前的marker位置不一樣裁着。
// marker 被拖動(dòng)的marker對(duì)象二驰。
@Override
public void onMarkerDrag(Marker marker) {
}
// 在marker拖動(dòng)完成后回調(diào)此方法, 這個(gè)marker的位置可以通過getPosition()方法返回。
// 這個(gè)位置可能與拖動(dòng)的之前的marker位置不一樣桶雀。
// marker 被拖動(dòng)的marker對(duì)象。
@Override
public void onMarkerDragEnd(Marker marker) {
LatLng latLng = marker.getPosition();
// 拖拽結(jié)束 更改原來標(biāo)記的經(jīng)緯度
addMarker(latLng.latitude,latLng.longitude);
}
});
監(jiān)聽地圖的點(diǎn)擊
aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
// 地圖 點(diǎn)擊 更換marker的經(jīng)緯度
addMarker(latLng.latitude,latLng.longitude);
}
});
根據(jù)經(jīng)緯度查詢相關(guān)信息
// 地理編碼搜索
private GeocodeSearch geocodeSearch;
// 初始化地理編碼搜索
geocodeSearch = new GeocodeSearch(this);
// 設(shè)置地理編碼搜索監(jiān)聽
geocodeSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int rCode) {
// 地理逆編碼回調(diào)函數(shù)
if (rCode == 1000) {
//解析result獲取地址描述信息
} else {
Log.e("onGeocodeSearchedError", "地理逆編碼查詢失敗敞咧,錯(cuò)誤碼" + rCode);
}
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {
// 地理編碼查詢回調(diào)
}
});
// 根據(jù)經(jīng)緯度逆地理編碼查詢
private void query(LatLng latLng) {
//逆地理編碼查詢條件:逆地理編碼查詢的地理坐標(biāo)點(diǎn)辜腺、查詢范圍、坐標(biāo)類型测砂。
LatLonPoint latLonPoint = new LatLonPoint(latLng.latitude, latLng.longitude);
// 第一個(gè)參數(shù)表示一個(gè)Latlng百匆,第二參數(shù)表示范圍多少米,第三個(gè)參數(shù)表示是火系坐標(biāo)系還是GPS原生坐標(biāo)系
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);
//異步查詢
geocodeSearch.getFromLocationAsyn(query);
}