-
创建应用
进入高德控制台后,点击“创建应用”按钮,进入创建应用的界面。 填上你的应用程序的名称以及选择应用类型就可以了, 最后点击最下方的 “创建”按钮,创建应用完毕。
创建应用1.png
创建应用2.png
-
添加key
在我的应用列表中点击刚才创建的应用的右边的➕号。
添加key1.png
填写Key名称、包名以及选择服务平台。
添加key2.png
获取发布版的SHA1(Mac电脑)
1.打开 终端
2.输入keytool -list -v -keystore 然后把签名文件直接拖进控制台 回车
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 配置到项目的 “AndroidManifest.xml” 文件中,添加如下代码:
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="请输入您的用户Key"/>
……
</application>
-
下载jar包并集成
根据需要选择功能.png
jar包复制到工程的 libs 目录下并右键 Add As Library
集成.png
-
定位的使用
声明Service组件
<service android:name="com.amap.api.location.APSService" />
声明权限
<!--用于进行网络定位-->
<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" />
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
初始化定位
/**
* 请在主线程中声明AMapLocationClient类对象,需要传Context类型的参数
* 推荐用getApplicationContext()方法获取全进程有效的context
*/
// 声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
// 初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mlocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
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信息
amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
amapLocation.getFloor();//获取当前室内定位的楼层
amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);
}else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError","location Error, ErrCode:"+ amapLocation.getErrorCode() + ", errInfo:"+ amapLocation.getErrorInfo());
}
}
}
});
配置定位参数
// 初始化定位参数对象
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
/**
* 设置单次定位或连续定位 不设置默认间隔2秒定位一次
*/
// 设置定位一次
mLocationOption.setOnceLocation(true);
// 设置连续定位,定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(1000);
/**
* 设置定位模式(三种模式) 不设置默认高精度定位模式
*/
// 高精度定位模式:会同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息。
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 低功耗定位模式:不会使用GPS和其他传感器,只会使用网络定位(Wi-Fi和基站定位);
mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving);
// 仅用设备定位模式:不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位,需要在室外环境下才可以成功定位。注意,自 v2.9.0 版本之后,仅设备定位模式下支持返回地址描述信息。
mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors);
给定位客户端对象设置定位参数并启动定位
mLocationClient.setLocationOption(mLocationOption);
// 启动定位
mLocationClient.startLocation();
-
2D地图的使用
声明权限
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<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"/>
查找控件并对Map的生命周期进行管理
public class MainActivity extends Activity {
MapView mMapView = null;
//初始化地图控制器对象
AMap aMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mMapView.getMap();
}
}
@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 onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}
}
绘制标记
// 声明标记
private Marker locationMarker;
/**
* 往地图上添加marker
*/
private void addMarker(double latitude,double longitude) {
LatLng latLng = new LatLng(latitude, longitude);
if (locationMarker != null) {
// maker已存在直接更换经纬度
locationMarker.setPosition(latLng);
// 缩放地图
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20));
return;
}
MarkerOptions markerOptions = new MarkerOptions();
// 在地图上标记位置的经纬度值。必填参数
markerOptions.position(latLng);
// 点标记的标题
markerOptions.title("长按此标记");
// 点标记的内容
markerOptions.snippet("可进行拖动");
// 点标记是否可拖拽
markerOptions.draggable(true);
// 点标记的锚点(不设置,默认中心点) 根据图片调节
markerOptions.anchor(0.5f, 1f);
// 图标不支持svg
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.gd_maker)));
// 地图上添加标记
locationMarker = aMap.addMarker(markerOptions);
// 缩放地图
// 参数二:地图缩放级别为4-20级
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20));
}
标记拖拽监听
aMap.setOnMarkerDragListener(new AMap.OnMarkerDragListener() {
@Override
public void onMarkerDragStart(Marker marker) {
}
// 在marker拖动过程中回调此方法, 这个marker的位置可以通过getPosition()方法返回。
// 这个位置可能与拖动的之前的marker位置不一样。
// marker 被拖动的marker对象。
@Override
public void onMarkerDrag(Marker marker) {
}
// 在marker拖动完成后回调此方法, 这个marker的位置可以通过getPosition()方法返回。
// 这个位置可能与拖动的之前的marker位置不一样。
// marker 被拖动的marker对象。
@Override
public void onMarkerDragEnd(Marker marker) {
LatLng latLng = marker.getPosition();
// 拖拽结束 更改原来标记的经纬度
addMarker(latLng.latitude,latLng.longitude);
}
});
监听地图的点击
aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
// 地图 点击 更换marker的经纬度
addMarker(latLng.latitude,latLng.longitude);
}
});
根据经纬度查询相关信息
// 地理编码搜索
private GeocodeSearch geocodeSearch;
// 初始化地理编码搜索
geocodeSearch = new GeocodeSearch(this);
// 设置地理编码搜索监听
geocodeSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int rCode) {
// 地理逆编码回调函数
if (rCode == 1000) {
//解析result获取地址描述信息
} else {
Log.e("onGeocodeSearchedError", "地理逆编码查询失败,错误码" + rCode);
}
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {
// 地理编码查询回调
}
});
// 根据经纬度逆地理编码查询
private void query(LatLng latLng) {
//逆地理编码查询条件:逆地理编码查询的地理坐标点、查询范围、坐标类型。
LatLonPoint latLonPoint = new LatLonPoint(latLng.latitude, latLng.longitude);
// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);
//异步查询
geocodeSearch.getFromLocationAsyn(query);
}
网友评论