记录高德地图API接入Android原生项目(二)

上一篇介绍了接入高德地图,显示地图,这篇介绍获取当前定位坐标。

1.首先根据上一篇在AndroidManififest.xml添加的权限缺少定位的权限,需要再添加一个权限:

<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

2.这个权限是需要动态允许的,所以在定位之前必须要获取该权限的允许。

在Activity中添加获取权限的方法代码:

//权限
void getPessimission() {

    ArrayList<String> permissions = new ArrayList<String>();


    if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED){//未开启定位权限
        //开启定位权限,200是标识码
        permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
    }else{
        //已开启定位权限,直接定位
        setPosition();
    }

    if (permissions != null && permissions.size() > 0) {
        String[] array = (String[]) permissions.toArray(new String[permissions.size()]);
        ActivityCompat.requestPermissions(this, array, 9);

    }
}

在获取权限回调方法里面也添加相应的代码:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode==9){
        if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
            setPosition();
        }

    }
}

3.添加定位代码:

Activity 实现 AMapLocationListener,并实现相关的onLocationChanged()方法;以下为Activity完整的代码:

package com.my.gaodemapdemo;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

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.LocationSource;

import java.util.ArrayList;

public class TestActivity2 extends AppCompatActivity implements
        AMapLocationListener {
    //定位
    private AMapLocationClient mlocationClient = null;
    private AMapLocationClientOption mLocationOption = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getPessimission();



    }


    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (aMapLocation != null) {
            Log.d("Test","location ecode: "+aMapLocation.getErrorInfo());
            if (aMapLocation.getErrorCode() == 0) {
                double lat = aMapLocation.getLatitude();
                double lon = aMapLocation.getLongitude();
//打印定位的坐标
                Log.d("Test","lat: "+lat);
                Log.d("Test","lon: "+lon);


            }
        }
    }



    void setPosition() {
        //声明mlocationClient对象
        //    AMapLocationClient mlocationClient;
//声明mLocationOption对象
        //   AMapLocationClientOption mLocationOption = null;
        mlocationClient = new AMapLocationClient(this);
//初始化定位参数
        mLocationOption = new AMapLocationClientOption();
//设置定位监听
        mlocationClient.setLocationListener(this);
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(2000);
//设置定位参数
        mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
//启动定位
        mlocationClient.startLocation();

    }



    private void destroyLocation() {
        if (null != mlocationClient) {
            /**
             * 如果AMapLocationClient是在当前Activity实例化的,
             * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
             */
            mlocationClient.onDestroy();
            mlocationClient = null;
            mLocationOption = null;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        destroyLocation();
    }

    //权限
    void getPessimission() {

        ArrayList<String> permissions = new ArrayList<String>();


        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED){//未开启定位权限
            //开启定位权限,200是标识码
            permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
        }else{
            //已开启定位权限,直接定位
            setPosition();
        }

        if (permissions != null && permissions.size() > 0) {
            String[] array = (String[]) permissions.toArray(new String[permissions.size()]);
            ActivityCompat.requestPermissions(this, array, 9);

        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==9){
            if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                setPosition();
            }

        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值