Android 开发之高德地图定位到当前位置
阅读数:201 评论数:0 字数统计:744 阅读时长 ≈ 2分钟under 高德地图 tag Published on May 18th , 2021 at 05:45 pm
显示高德地图,定位前先看这篇。
官方文档
看文档都能写出来... 纯记录
效果图
使用5.0.0版本前后没有太大差别,唯一的就是5.0.0后的代码少了。
定位到当前位置
5.0.0版本后
1、添加权限(参照5.0.0版本前)
2、初始化 AMap,设置定位相关内容
// 获取地图对象
if (aMap == null) {
aMap = mapView.getMap();
}
// 地图上标志是否可以点击
aMap.setMyLocationEnabled(true);
3、实现定位蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.interval(2000);
myLocationStyle.showMyLocation(true);
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
aMap.setMyLocationStyle(myLocationStyle);
aMap.setMyLocationEnabled(true);
// 要 implements AMap.OnMyLocationChangeListener
aMap.setOnMyLocationChangeListener(this);
4、实现监听事件后重写 onMyLocationChange(Location location)
@Override
public void onMyLocationChange(Location location) {
aMap.moveCamera(CameraUpdateFactory.zoomTo(19));
//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(location.getLatitude(), location.getLongitude())));
}
5.0.0版本前
1、AndroidManifest.xml 添加基础权限
<!-- 地图SDK(包含其搜索功能)需要的基础权限 -->
<!--允许程序打开网络套接字--><!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序访问CellID或WiFi热点来获取粗略的位置--><!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--允许程序设置内置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" />
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
2、初始化 AMap 对象,设置定位相关内容
// 获取地图对象
if (aMap == null) {
aMap = mapView.getMap();
}
// 设置定位监听
aMap.setLocationSource(this);
// 地图上标志是否可以点击
aMap.setMyLocationEnabled(true);
3、声明
4、初始化
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(true);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
5、重写方法
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
}
@Override
public void deactivate() {
mListener = null;
if (mLocationClient != null) {
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
mLocationClient = null;
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
Log.d("位置", "onLocationChanged: " + aMapLocation.getAddress());
aMap.moveCamera(CameraUpdateFactory.zoomTo(19));
//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
mListener.onLocationChanged(aMapLocation);
} else {
Toast.makeText(this, "错误信息" + aMapLocation.getErrorInfo().split(" ")[0], Toast.LENGTH_SHORT).show();
Log.e("AmapError", "location Error, ErrCode: " + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo());
}
}
}
完整代码
文章
代码里有一句AMapLocationClient.setApiKey("keyValue");
这句是因为我在定位时 ErrInfo 显示 Key 错误,但是是没问题的,加了这句代码后就能定位了。
如果没有显示 key 错误不加这句是可以定位的。
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
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.model.LatLng;
import com.amap.api.maps.model.MarkerOptions;
public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener {
MapView mapView;
AMap aMap;
private AMapLocationClient mLocationClient = null;
private AMapLocationClientOption mLocationOption = null;
private OnLocationChangedListener mListener = null;//定位监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
// 解决 key 错误问题。设置 apikey 必须在 AmapLocationClient 实例化之前调用
AMapLocationClient.setApiKey("keyValue");
// 获取地图对象
if (aMap == null) {
aMap = mapView.getMap();
}
// 设置定位监听
aMap.setLocationSource(this);
// 地图上标志是否可以点击
aMap.setMyLocationEnabled(true);
initLoc();
}
private void initLoc() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(true);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
if (null != mLocationClient) {
mLocationClient.onDestroy();
}
}
@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
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
}
@Override
public void deactivate() {
mListener = null;
if (mLocationClient != null) {
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
mLocationClient = null;
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
Log.d("位置", "onLocationChanged: " + aMapLocation.getAddress());
aMap.moveCamera(CameraUpdateFactory.zoomTo(19));
//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
mListener.onLocationChanged(aMapLocation);
} else {
Toast.makeText(this, "错误信息" + aMapLocation.getErrorInfo().split(" ")[0], Toast.LENGTH_SHORT).show();
Log.e("AmapError", "location Error, ErrCode: " + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo());
}
}
}
}
本文由 surface 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
文章最后更新时间为:October 15th , 2021 at 05:25 pm
分享到:Twitter Weibo Facebook