Android調(diào)用高德地圖定位的方法
在App中使用地圖定位十分常見,購物功能的可以直接定位當前位置,發(fā)動態(tài)功能可以定位當前位置發(fā)出,社交功能可以定位周邊用戶等等。這里我使用高德地圖定位當前位置并顯示地址和經(jīng)緯度。
先上效果圖:

實現(xiàn)步驟:
1. 創(chuàng)建應用獲取key:
接入第三方無一例外,去高德地圖官網(wǎng)注冊賬號并創(chuàng)建應用。填入包名和keystore的Sha1。

創(chuàng)建應用
獲取Sha1,輸入命令keytool -v -list -keystore keystore文件路徑,我在這里通過控制臺獲取調(diào)試版的:
進入.android目錄
cd .android
輸入命令獲取
keytool -v -list -keystore debug.keystore
過程截圖:

創(chuàng)建完成獲取Key:

2. 接入SDK
添加定位庫
compile 'com.amap.api:location:latest.integration'
添加2D地圖庫
compile 'com.amap.api:map2d:latest.integration'
添加地圖權限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
在<application></application>中設置地圖key
<meta-data android:name="com.amap.api.v2.apikey" android:value="57b811b21061501ee320e171568f0dac" />
3. 代碼實現(xiàn)(帶每一步功能注釋):
實現(xiàn)思路:創(chuàng)建MapView顯示地圖;設置定位定位監(jiān)聽,設置定位參數(shù),在activate激活后啟動定位;在定位回調(diào)中獲取經(jīng)緯度,在將地圖移動到定位位置,在該經(jīng)緯度上添加覆蓋圖標。詳細代碼如下:
地圖控件:
<com.amap.api.maps2d.MapView
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
定位類AmapActivity完整代碼:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.amap.api.location.AMapLocation;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.model.LatLng;
public class AmapActivity extends AppCompatActivity implements LocationSource {
private MapView mapView;
private AMap aMap;
private LocationSource.OnLocationChangedListener mListener = null;//定位監(jiān)聽器
private LocationUtil locationUtil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_amap);
mapView = (MapView) findViewById(R.id.mapview);
mapView.onCreate(savedInstanceState);
init();
}
private void init() {
if(aMap == null){
aMap = mapView.getMap();
}
setLocationCallBack();
//設置定位監(jiān)聽
aMap.setLocationSource(this);
//設置縮放級別
aMap.moveCamera(CameraUpdateFactory.zoomTo(15));
//顯示定位層并可觸發(fā),默認false
aMap.setMyLocationEnabled(true);
}
private void setLocationCallBack(){
locationUtil = new LocationUtil();
locationUtil.setLocationCallBack(new LocationUtil.ILocationCallBack() {
@Override
public void callBack(String str,double lat,double lgt,AMapLocation aMapLocation) {
//根據(jù)獲取的經(jīng)緯度,將地圖移動到定位位置
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(lat,lgt)));
mListener.onLocationChanged(aMapLocation);
//添加定位圖標
aMap.addMarker(locationUtil.getMarkerOption(str,lat,lgt));
}
});
}
//定位激活回調(diào)
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
locationUtil.startLocate(getApplicationContext());
}
@Override
public void deactivate() {
mListener = null;
}
@Override
protected void onPause() {
super.onPause();
//暫停地圖的繪制
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//銷毀地圖
mapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//重新繪制加載地圖
mapView.onResume();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
}
定位參數(shù)設置和定位回調(diào)LocationUtil類完整代碼:
import android.content.Context;
import android.util.Log;
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.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.LatLng;
import com.amap.api.maps2d.model.MarkerOptions;
/**
* Created by libo on 2018/2/2.
*/
public class LocationUtil implements AMapLocationListener {
private AMapLocationClient aMapLocationClient;
private AMapLocationClientOption clientOption;
private ILocationCallBack callBack;
public void startLocate(Context context){
aMapLocationClient = new AMapLocationClient(context);
//設置監(jiān)聽回調(diào)
aMapLocationClient.setLocationListener(this);
//初始化定位參數(shù)
clientOption = new AMapLocationClientOption();
clientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
clientOption.setNeedAddress(true);
clientOption.setOnceLocation(false);
//設置是否強制刷新WIFI,默認為強制刷新
clientOption.setWifiActiveScan(true);
//設置是否允許模擬位置,默認為false,不允許模擬位置
clientOption.setMockEnable(false);
//設置定位間隔
clientOption.setInterval(2000);
aMapLocationClient.setLocationOption(clientOption);
aMapLocationClient.startLocation();
}
//完成定位回調(diào)
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if(aMapLocation != null){
if(aMapLocation.getErrorCode() == 0){
//定位成功完成回調(diào)
String country = aMapLocation.getCountry();
String province = aMapLocation.getProvince();
String city = aMapLocation.getCity();
String district = aMapLocation.getDistrict();
String street = aMapLocation.getStreet();
double lat = aMapLocation.getLatitude();
double lgt = aMapLocation.getLongitude();
callBack.callBack(country + province + city + district + street,lat,lgt,aMapLocation);
}else{
//顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼表。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
}
/**
* 自定義圖標
* @return
*/
public MarkerOptions getMarkerOption(String str,double lat,double lgt){
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.position));
markerOptions.position(new LatLng(lat,lgt));
markerOptions.title(str);
markerOptions.snippet("緯度:" + lat + " 經(jīng)度:" + lgt);
markerOptions.period(100);
return markerOptions;
}
public interface ILocationCallBack{
void callBack(String str,double lat,double lgt,AMapLocation aMapLocation);
}
public void setLocationCallBack(ILocationCallBack callBack){
this.callBack = callBack;
}
}
錯誤情況檢查:
- Key是否配置錯誤
- 在onCreate中調(diào)用mapView.onCreate(savedInstanceState);
- mapView.onPause()、mapView.onDestroy()、mapView.onResume()、mapView.onSaveInstanceState(outState)是否都已調(diào)用且不寫錯
- aMap.setMyLocationEnabled(true)設置顯示定位層并可觸發(fā)
- 手機是否開啟定位
好了,調(diào)用地圖的基本功能完成,更高級的功能還包括Poi檢索,附近搜索,路線規(guī)劃,后續(xù)會繼續(xù)完善該功能。以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android 中使用RadioGroup和Fragment實現(xiàn)底部導航欄的功能
這篇文章主要介紹了Android 中使用RadioGroup+Fragment實現(xiàn)底部導航欄的功能,整體文章大概分為兩部分介紹,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-06-06
Android TreeView效果實現(xiàn)方法(附demo源碼下載)
這篇文章主要介紹了Android TreeView效果實現(xiàn)方法,結合實例形式分析了Android TreeView效果的實現(xiàn)原理與具體技巧,并附帶demo源碼供讀者下載,需要的朋友可以參考下2016-02-02
android:TextView簡單設置文本樣式和超鏈接的方法
這篇文章主要介紹了android:TextView簡單設置文本樣式和超鏈接的方法,涉及TextView常見文字屬性的相關操作技巧,需要的朋友可以參考下2016-08-08

