一、基礎地圖部分
1.獲取APPKey
在高德地圖註冊開發者賬號,然後創建應用,使用SHA1和PackageName得到Key
創建應用的鏈接:http://lbs.amap.com/
創建應用 輸入你的應用名稱 選擇你的應用類型 點擊確定
點擊確定之後得到這麼一個東西點擊添加新key 輸入完畢後再下方點擊提交 獲取SHA1值以及應用包名見下方
獲取SHA1值方法:
首先使用cmd 打開dos窗口
輸入cd .android 切換到 .android目錄
使用keytool工具獲取簽名的SHA1值 輸入命令:keytool -list -v -keystore debug.keystore 祕鑰口令輸入 android 或者直接回車
這裏的指紋整數有MD5、SHA1、SHA256 這樣就拿到了上面需要的SHA1值
獲取應用包名:
打開你的gradle文件
這就是你的應用包名
提交之後得到的AppKey:
2.下載SDK
下載地址:http://lbs.amap.com/api/android-sdk/down/
定位SDK下載地址:http://lbs.amap.com/api/android-location-sdk/download/
3.導入項目
把下載下來的壓縮包解壓,裏面的jar包放到項目的libs目錄下
然後Add As Library
集成高德地圖需要用到.so文件 解壓得到的.so文件 目錄裏面就是所需的.so文件
在main目錄下創建jniLibs目錄 注意是main目錄 將解壓得到的.so文件連帶目錄都copy到jniLibs目錄下
4.配置清單文件
在AndroidManifest.xml裏面添加你的AppKey
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="99ac75ad4aa47d9b865cee7c3ef31a89"/>
在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.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
配置Service
<service android:name="com.amap.api.location.APSService"/>
5.佈局文件:
在佈局文件中添加地圖控件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="demo.gaode.com.gaodemapdemo.ShowMapActivity">
<!-- 引入佈局文件 -->
<com.amap.api.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
6.正式開始寫代碼了
1.基礎地圖顯示
效果圖
初始化地圖控件 管理地圖控件生命週期
package demo.gaode.com.gaodemapblog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.amap.api.maps.MapView;
public class ShowMapActivity extends AppCompatActivity {
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_map);
//初始化地圖控件
mapView = (MapView) findViewById(R.id.map);
//必須要寫
mapView.onCreate(savedInstanceState);
}
/**
* 方法必須重寫
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必須重寫
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
/**
* 方法必須重寫
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必須重寫
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
}
2.定位功能實現
效果圖以及Log
效果圖和基礎地圖的效果圖沒什麼區別,因爲我既沒有設置中心點也沒有設置marker,但是我獲取到了位置,那麼定位完畢後添加一箇中心點,一個marker就可以完成基礎地圖+定位+marker的效果了
先把定位的所有代碼貼出來
package demo.gaode.com.gaodemapblog;
import android.app.Activity;
import android.os.Bundle;
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.maps.AMap;
import com.amap.api.maps.MapView;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ShowMapActivity extends Activity {
private MapView mapView;
private AMap aMap;
//聲明AMapLocationClient類對象
public AMapLocationClient mLocationClient = null;
//聲明定位回調監聽器
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (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();//地區編碼
amapLocation.getAoiName();//獲取當前定位點的AOI信息
lat = amapLocation.getLatitude();
lon = amapLocation.getLongitude();
Log.v("pcw","lat : "+lat+" lon : "+lon);
} else {
//顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
//聲明mLocationOption對象
public AMapLocationClientOption mLocationOption = null;
private double lat;
private double lon;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_map);
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);//必須要寫
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//設置定位回調監聽
mLocationClient.setLocationListener(mLocationListener);
init();
}
/**
* * 初始化AMap對象
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
}
setUpMap();
}
private void setUpMap() {
//初始化定位參數
mLocationOption = new AMapLocationClientOption();
//設置定位模式爲高精度模式,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(2000);
//給定位客戶端對象設置定位參數
mLocationClient.setLocationOption(mLocationOption);
//啓動定位
mLocationClient.startLocation();
}
/**
* 方法必須重寫
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必須重寫
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onStop() {
super.onStop();
mLocationClient.stopLocation();//停止定位
}
/**
* 方法必須重寫
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必須重寫
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
mLocationClient.onDestroy();//銷燬定位客戶端。
}
}
這裏面有一個地方千萬要記住,一定要在AndroidManifest.xml中註冊廣播 否則定位會失敗
<service android:name="com.amap.api.location.APSService"/>
下面來講講這段代碼裏面幾個組成:
初始化定位
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//設置定位回調監聽
mLocationClient.setLocationListener(mLocationListener);
初始化AMap對象
/**
* * 初始化AMap對象
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
}
setUpMap();
}
配置定位參數並開始定位
/**
* 配置定位參數
*/
private void setUpMap() {
//初始化定位參數
mLocationOption = new AMapLocationClientOption();
//設置定位模式爲高精度模式,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(2000);
//給定位客戶端對象設置定位參數
mLocationClient.setLocationOption(mLocationOption);
//啓動定位
mLocationClient.startLocation();
}
在onStop裏面停止定位
@Override
protected void onStop() {
super.onStop();
mLocationClient.stopLocation();//停止定位
}
在onDestory方法裏面銷燬定位
/**
* 方法必須重寫
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
mLocationClient.onDestroy();//銷燬定位客戶端。
}
設置定位監聽,在監聽中可以獲取定位的一系列數據
/**
* 聲明定位回調監聽器
*/
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (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();//地區編碼
amapLocation.getAoiName();//獲取當前定位點的AOI信息
lat = amapLocation.getLatitude();
lon = amapLocation.getLongitude();
Log.v("pcw","lat : "+lat+" lon : "+lon);
} else {
//顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
3.設置中心點以及marker
效果圖
有了效果圖 那麼我把基礎地圖+定位+marker的代碼貼出來
package demo.gaode.com.gaodemapblog;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
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.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MarkerOptions;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ShowMapActivity extends Activity {
private MapView mapView;
private AMap aMap;
//聲明AMapLocationClient類對象
public AMapLocationClient mLocationClient = null;
/**
* 聲明定位回調監聽器
*/
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (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();//地區編碼
amapLocation.getAoiName();//獲取當前定位點的AOI信息
lat = amapLocation.getLatitude();
lon = amapLocation.getLongitude();
Log.v("pcw", "lat : " + lat + " lon : " + lon);
Log.v("pcw", "Country : " + amapLocation.getCountry() + " province : " + amapLocation.getProvince() + " City : " + amapLocation.getCity() + " District : " + amapLocation.getDistrict());
// 設置當前地圖顯示爲當前位置
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 19));
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(new LatLng(lat, lon));
markerOptions.title("當前位置");
markerOptions.visible(true);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.location_marker));
markerOptions.icon(bitmapDescriptor);
aMap.addMarker(markerOptions);
} else {
//顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
//聲明mLocationOption對象
public AMapLocationClientOption mLocationOption = null;
private double lat;
private double lon;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_map);
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);//必須要寫
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//設置定位回調監聽
mLocationClient.setLocationListener(mLocationListener);
init();
}
/**
* * 初始化AMap對象
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
}
setUpMap();
}
/**
* 配置定位參數
*/
private void setUpMap() {
//初始化定位參數
mLocationOption = new AMapLocationClientOption();
//設置定位模式爲高精度模式,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(2000);
//給定位客戶端對象設置定位參數
mLocationClient.setLocationOption(mLocationOption);
//啓動定位
mLocationClient.startLocation();
}
/**
* 方法必須重寫
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必須重寫
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onStop() {
super.onStop();
mLocationClient.stopLocation();//停止定位
}
/**
* 方法必須重寫
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必須重寫
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
mLocationClient.onDestroy();//銷燬定位客戶端。
}
}
代碼實際上沒什麼難度,也不多,下面我把設置marker的代碼貼出來
// 設置當前地圖顯示爲當前位置
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 19));
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(new LatLng(lat, lon));
markerOptions.title("當前位置");
markerOptions.visible(true);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.location_marker));
markerOptions.icon(bitmapDescriptor);
aMap.addMarker(markerOptions);
好了,到這裏 基礎地圖+定位+marker就做出來了