Android 高德地图定位功能的实现步骤

这篇博客详细记录了Android应用中集成高德地图定位功能的步骤,包括获取API Key、声明权限、配置工程、AndroidManifest.xml设置,以及不同定位模式的介绍。通过这个指南,开发者可以更清晰地理解如何在自己的应用中实现高德地图的定位功能。
摘要由CSDN通过智能技术生成

最近才开始集成Android的高德地图的定位功能,发现开放平台记录的不是特别的清楚明白,在这里简单的实现记录一下。刚开始写文档记录,有的逻辑可能不是很清晰,如果有说的不明白的地方,还希望大家多多提供意见。下面开始进入正题:

首先进入高德地图的开放平台,然后进入控制台—》创建新应用——》填写应用名称和应用类型,点击确定——》添加新key,效果如下图

点击添加新key之后,填写应用的各项信息,

在这里涉及到一个获取SHA1码的问题,获取方法我使用的是命令终端实现的,具体步骤如下:

在电脑的运行中敲cmd启动终端命令行程序,然后输入cd  .android    回车,定位到Android文件夹

然后再调试版本使用 debug.keystore,命令为:keytool -list -v -keystore debug.keystore。发布版本使用 apk 对应的 keystore,命令为:keytool -list -v -keystore apk 的 kenstore。输入后再回车

提示输入密钥库密码,开发模式默认密码是 android,发布模式的密码是为 apk 的 keystore 设置的密码。输入密钥后回车(如果没设置密码,可直接回车),此时可在控制台显示的信息中获取 Sha1 值,如下图所示:

在证书指纹里面找到SHA1添加到申请里面就可以了,包名的获取大家应该都知道,就不说了。

都填写提交之后就可以得到key,


Android Studio下配置工程:

第一步:新建工程

第二步:

1、拷贝 jar 文件至 libs 文件夹下

将从开放平台下载的SDK文件下的jar包复制到Android studio libs 目录下,



2、配置 build.gradle 文件

在libs的文件 右键,选择add as Library。


获取地图

第一步:配置AndroidManifest.xml

首先,获取key

在application 中添加您的用户key

<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="f1fefa369208f6d2b167ede50cbfe6b4" />

然后,声明权限

<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.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

然后在xml文件中添加地图控件布局
<com.amap.api.maps2d.MapView
    android:id="@+id/map_view"
    android:layout_width="1dp"
    android:layout_height="1dp" />


其次,创建地图,管理地图的生命周期
public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener {
    private MapView mMapView = null;
    private AMap aMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);

        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.map_view);
        //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
        mMapView.onCreate(savedInstanceState);
}
@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 onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理
    mMapView.onSaveInstanceState(outState);
}
注意:一定要有mMapView.onCreate(savedInstanceState);
然后运行程序,地图应该就可以显示出来。

获取定位信息数据

第一步:配置AndroidManifest.xml

1.在application标签中声明service组件,每个app拥有自己单独的定位service。

<service android:name="com.amap.api.location.APSService"/>
2.在XML文件中添加权限

<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" />
第二步 获取定位的数据

1.在onCreate中添加定位的小圆圈显示

if (aMap == null) {
    aMap = mMapView.getMap();
    //设置显示定位按钮 并且可以点击
    UiSettings settings = aMap.getUiSettings();
    aMap.setLocationSource(this);//设置了定位的监听,这里要实现LocationSource接口
    // 是否显示定位按钮
    settings.setMyLocationButtonEnabled(true);
    aMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
}

2.启动定位信息

//初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听,这里要实现AMapLocationListener接口,AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,参数是AMapLocation类型。
mLocationClient.setLocationListener(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,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();

第三步。定位模式

定位模式有三种,分别为高进度模式、低功耗定位模式、以及仅设备定位模式

高精度定位模式下,将同时使用高德网络定位和GPS定位,优先返回精度高的定位。

在低功耗定位模式下,将只使用高德网络定位。
在设备定位模式下,将只使用GPS定位。

我使用的是设备定位模式,实现如下
activity实现监听接口,复写实现的方法
public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener{}
复写方法实现如下:
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
    mListener = onLocationChangedListener;
}

@Override
public void deactivate() {
    mListener = null;
}

@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();//地区编码

            // 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置
            if (isFirstLoc) {
                //设置缩放级别
                aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
                //将地图移动到定位点
                aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
                //点击定位按钮 能够将地图的中心移动到定位点
                mListener.onLocationChanged(aMapLocation);
                //获取定位信息
                StringBuffer buffer = new StringBuffer();
                buffer.append(aMapLocation.getCountry() + ""
                        + aMapLocation.getProvince() + ""
                        + aMapLocation.getCity() + ""
                        + aMapLocation.getProvince() + ""
                        + aMapLocation.getDistrict() + ""
                        + aMapLocation.getStreet() + ""
                        + aMapLocation.getStreetNum());
                Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show();

                tv.setText(aMapLocation.getCity());
                isFirstLoc = false;
            }
        } else {
            //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
            Log.e("AmapError", "location Error, ErrCode:"
                    + aMapLocation.getErrorCode() + ", errInfo:"
                    + aMapLocation.getErrorInfo());
            Toast.makeText(getApplicationContext(), "定位失败", Toast.LENGTH_LONG).show();
        }
    }
}

第四步 激活和停止定位

@Override
protected void onDestroy() {
    super.onDestroy();
    //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
    mMapView.onDestroy();

    mLocationClient.stopLocation();//停止定位
    mLocationClient.onDestroy();//销毁定位客户端。
    //销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
    mListener = onLocationChangedListener;
}

@Override
public void deactivate() {
    mListener = null;
}









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值