Android 开发之高德地图定位到当前位置

under 高德地图  Android  tag     Published on May 18th , 2021 at 05:45 pm

显示高德地图,定位前先看这篇。

官方文档

看文档都能写出来... 纯记录


效果图

Screenshot_20210518_173528_com.example.amap3d.jpg

使用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 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:August 11th , 2021 at 10:32 am
分享到:Twitter  Weibo  Facebook