主页 > 人工智能  > 

【高德地图】Android高德地图初始化定位并显示小蓝点


📖第3章 初始化定位并显示小蓝点 ✅第1步:配置AndroidManifest.xml✅第2步:设置定位蓝点✅第3步:初始化定位✅完整代码

✅第1步:配置AndroidManifest.xml 在application标签下声明Service组件 <service android:name="com.amap.api.location.APSService"></service> 声明权限 <!--地图相关--> <uses-permission android:name="android.permission.INTERNET" /> <!-- 访问网络--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 网络定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- GPS定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 访问WiFi网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 获取wifi权限,进行网络定位 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!-- 用于读数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于写入缓存数据到扩展存储卡 --> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 用于申请调用A-GPS模块 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--允许程序获取网络状态--> 设置高德Key,在上一步显示地图时已经完成 <meta-data android:name="com.amap.api.v2.apikey" android:value="key">//开发者申请的key </meta-data> ✅第2步:设置定位蓝点 //设置了定位的监听 aMap.setLocationSource(this); //初始化定位蓝点样式类 MyLocationStyle myLocationStyle; myLocationStyle = new MyLocationStyle(); myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);//设置定位模式 myLocationStyle.interval(2000); //只在连续定位模式下生效 myLocationStyle.showMyLocation(true);//设置是否显示定位小蓝点 // 将定位蓝点移动到屏幕中心 myLocationStyle.anchor(0.5f, 0.5f).myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW); aMap.setMyLocationStyle(myLocationStyle); aMap.setMyLocationEnabled(true);// 是否启动显示定位蓝点,默认是false

如果你不想显示蓝点精度圆圈,可以参考下面设置:

myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));//设置定位蓝点精度圆圈的边框颜色:无色 myLocationStyle.radiusFillColor(Color.argb(0, 255, 255, 255)); // 设置精度圆圈背景色:透明无色 ✅第3步:初始化定位 实现LocationSource和AMapLocationListener接口,重写activate、deactivate和onLocationChanged方法。 @Override public void activate(OnLocationChangedListener onLocationChangedListener) { } @Override public void deactivate() { } @Override public void onLocationChanged(AMapLocation aMapLocation) { } 在activate中实现定位激活。 private OnLocationChangedListener mListener;//声明位置监听 private AMapLocationClient mlocationClient;//声明定位客户端 private AMapLocationClientOption mLocationOption;//声明定位参数配置选项 /** * 激活定位 */ @Override public void activate(LocationSource.OnLocationChangedListener listener) { mListener = listener; if (mlocationClient == null) { //初始化定位 try { mLocationOption = new AMapLocationClientOption();//初始化定位参数 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置为高精度定位模式 mlocationClient = new AMapLocationClient(this);//声明定位客户端 mlocationClient.setLocationListener(this);//设置定位回调监听 mlocationClient.setLocationOption(mLocationOption);//设置定位参数 mlocationClient.startLocation();//启动定位 } catch (Exception e) { throw new RuntimeException(e); } } } 在deactivate中实现停止定位。 /** * 停止定位 */ @Override public void deactivate() { mListener = null; if (mlocationClient != null) { mlocationClient.stopLocation(); mlocationClient.onDestroy(); } mlocationClient = null; } 在onLocationChanged中监听定位回调。 private boolean isFirstLoc = true;//判断是否第一次定位 private LatLng currentLatLng;//当前定位 /** * 监听定位回调 * @param aMapLocation */ @Override public void onLocationChanged(AMapLocation aMapLocation) { if (mListener != null && 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();//地区编码 // 是否第一次定位 if (isFirstLoc) { aMap.moveCamera(CameraUpdateFactory.zoomTo(16));//设置缩放级别 currentLatLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()); //获取当前定位 aMap.moveCamera(CameraUpdateFactory.changeLatLng(currentLatLng));//移动到定位点 //点击定位按钮 能够将地图的中心移动到定位点 mListener.onLocationChanged(aMapLocation); isFirstLoc = false; } } else { //显示错误信息 Log.e("AmapError", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo()); } } }

**注意:**检查是否开启了应用定位权限和高精度定位

✅完整代码

MainActivity类:

package com.st.demo; import android.os.Bundle; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; 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.LocationSource; import com.amap.api.maps.MapView; import com.amap.api.maps.MapsInitializer; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.MyLocationStyle; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener { private MapView mMapView;//声明一个地图视图对象 private AMap aMap;//声明一个地图图层 private OnLocationChangedListener mListener;//声明位置监听 private AMapLocationClient mlocationClient;//声明定位客户端 private AMapLocationClientOption mLocationOption;//声明定位参数配置选项 private boolean isFirstLoc = true;//判断是否第一次定位 private LatLng currentLatLng;//当前定位 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化地图定位 initMap(savedInstanceState); } /** * 初始化地图 * @param savedInstanceState */ private void initMap(Bundle savedInstanceState) { //隐私合规接口 MapsInitializer.updatePrivacyShow(this, true, true); MapsInitializer.updatePrivacyAgree(this, true); AMapLocationClient.updatePrivacyAgree(this, true); AMapLocationClient.updatePrivacyShow(this, true, true); //获取地图视图对象 mMapView = findViewById(R.id.map); //创建地图 mMapView.onCreate(savedInstanceState); if (aMap == null) { aMap = mMapView.getMap(); } //设置了定位的监听 aMap.setLocationSource(this); //初始化定位蓝点样式类 MyLocationStyle myLocationStyle; myLocationStyle = new MyLocationStyle(); myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);//设置定位模式 myLocationStyle.interval(2000); //只在连续定位模式下生效 myLocationStyle.showMyLocation(true);//设置是否显示定位小蓝点 // 将定位蓝点移动到屏幕中心 myLocationStyle.anchor(0.5f, 0.5f).myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW); aMap.setMyLocationStyle(myLocationStyle); aMap.setMyLocationEnabled(true);// 是否启动显示定位蓝点,默认是false。 } /** * 激活定位 */ @Override public void activate(LocationSource.OnLocationChangedListener listener) { mListener = listener; if (mlocationClient == null) { //初始化定位 try { mLocationOption = new AMapLocationClientOption();//初始化定位参数 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置为高精度定位模式 mlocationClient = new AMapLocationClient(this);//声明定位客户端 mlocationClient.setLocationListener(this);//设置定位回调监听 mlocationClient.setLocationOption(mLocationOption);//设置定位参数 mlocationClient.startLocation();//启动定位 } catch (Exception e) { throw new RuntimeException(e); } } } /** * 停止定位 */ @Override public void deactivate() { mListener = null; if (mlocationClient != null) { mlocationClient.stopLocation(); mlocationClient.onDestroy(); } mlocationClient = null; } /** * 监听定位回调 * @param aMapLocation */ @Override public void onLocationChanged(AMapLocation aMapLocation) { if (mListener != null && 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();//地区编码 // 是否第一次定位 if (isFirstLoc) { aMap.moveCamera(CameraUpdateFactory.zoomTo(16));//设置缩放级别 currentLatLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()); //获取当前定位 aMap.moveCamera(CameraUpdateFactory.changeLatLng(currentLatLng));//移动到定位点 //点击定位按钮 能够将地图的中心移动到定位点 mListener.onLocationChanged(aMapLocation); isFirstLoc = false; } } else { //显示错误信息 Log.e("AmapError", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo()); } } } /** * 生命周期-onDestroy */ @Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy(); //销毁地图 } /** * 生命周期-onResume */ @Override protected void onResume() { super.onResume(); mMapView.onResume(); //重新绘制加载地图 } /** * 生命周期-onPause */ @Override protected void onPause() { super.onPause(); mMapView.onPause();//暂停地图的绘制 } /** * 生命周期-onSaveInstanceState */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState);//保存地图当前的状态 } }

activity_main.xml布局文件:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent"> </com.amap.api.maps.MapView> </LinearLayout>

AndroidManifest.xml中的权限相关省略,参考上面的。


✅第1,2章 Android搭建3D高德地图详细教 ✅第 3 章 初始化定位并显示小蓝点 ✅第 4 章Android高德地图绘制标记点Marker ✅第 5 章Android高德地图控件交互详细介绍

标签:

【高德地图】Android高德地图初始化定位并显示小蓝点由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【高德地图】Android高德地图初始化定位并显示小蓝点