a.File->New->New Project
b.选择Phone and Table -> Empty Activity ->NEXT->finish
官网地址:高德开放平台 | 高德地图API (amap.com)
进去后呢我们需要干两件事(获取key和将高德地图api导入app)
3.我们创建一个应用,名字叫csdn_location,选应用类型选其他(纯属个人命名爱好哈)最后点击添加。
4.到这一步呢,到重点了!!!!!!!!!
这里的SHA1获取方法呢,在C盘的用户文件夹的.android中,里边有个debug.keystore,找到这个文件我们就成功一半了。
接下来就WIN+R输入cmd,进入后勒输入android studio的安装所在的盘
打开android studio的安装文件的jre文件中的bin文件,看到keytool.exe说明成功找到了
我们先cd到keytool.exe在的文件,就是上一步找的地址,然后.\keytool -v -list -keystore+debug.keystore的路径
秘钥的密码默认是android,复制SHA1
包名呢就打开刚刚创建的MainActivity.java上面package
然后我们就完成了一件事
官方提供了两种方法,一种是通过拷贝集成SDK,一种是通过Gradle集成SDK
官方网址:
Android Studio 配置工程-创建工程-开发指南-Android 定位SDK|高德地图API (amap.com)
我们这里只采用方法2,方法1后期更新
第一步:
第二步:
编译一下没问题
首先声明Service组件,然后,声明权限,最后,设置高德Key,红色框框就是我们上面获得的key了
官方网址:获取定位数据-获取位置-开发指南-Android 定位SDK|高德地图API (amap.com)
我们先编写一个朴实无华的.xml文件,加入TextView控件以便后面打印定位信息
有一个点很容易忘记的是在调用高德的API前一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定一定要加入进行合规检查,设置接口之前保证隐私政策合规,个人先前失败就是没有注意到这一点,排查了两天才在debug的小角落中发现。
下面直接上代码
package com.example.csdn_location_demo;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
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 java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity implements AMapLocationListener {
private static final int MY_PERMISSIONS_REQUEST_CALL_LOCATION = 1;
public AMapLocationClient mlocationClient;
public AMapLocationClientOption mLocationOption = null;
public TextView location;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
location = (TextView) findViewById(R.id.TV_LOACATION);
AMapLocationClient.updatePrivacyShow(this,true,true);
AMapLocationClient.updatePrivacyAgree(this,true);
//检查版本是否大于M
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_CALL_LOCATION);
} else {
//"权限已申请";
showLocation();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == MY_PERMISSIONS_REQUEST_CALL_LOCATION) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//"权限已申请"
showLocation();
} else {
Toast.makeText(getBaseContext(),"权限已拒绝,不能定位",Toast.LENGTH_SHORT).show();
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
// TODO:
private void showLocation() {
try {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
mlocationClient.setLocationListener(this);
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
mLocationOption.setInterval(5000);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
//启动定位
mlocationClient.startLocation();
} catch (Exception e) {
}
}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
try {
if (amapLocation != null) {
StringBuffer dz = new StringBuffer();
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
Toast.makeText(getBaseContext(),"收到定位",Toast.LENGTH_SHORT).show();
//获取当前定位结果来源,如网络定位结果,详见定位类型表
dz.append("定位类型: "+ amapLocation.getLocationType() + "\n");
dz.append("获取纬度: "+ amapLocation.getLatitude() + "\n");
dz.append("获取经度: "+ amapLocation.getLongitude() + "\n");
dz.append("获取精度信息: "+ amapLocation.getAccuracy() + "\n");
//如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
dz.append("地址: "+ amapLocation.getAddress() + "\n");
dz.append("国家信息: "+ amapLocation.getCountry() + "\n");
dz.append("省信息: "+ amapLocation.getProvince() + "\n");
dz.append("城市信息: "+ amapLocation.getCity() + "\n");
dz.append("城区信息: "+ amapLocation.getDistrict() + "\n");
dz.append("街道信息: "+ amapLocation.getStreet() + "\n");
dz.append("街道门牌号信息: "+ amapLocation.getStreetNum() + "\n");
dz.append("城市编码: "+ amapLocation.getCityCode() + "\n");
dz.append("地区编码: "+ amapLocation.getAdCode() + "\n");
dz.append("获取当前定位点的AOI信息: "+ amapLocation.getAoiName() + "\n");
dz.append("获取当前室内定位的建筑物Id: "+ amapLocation.getBuildingId() + "\n");
dz.append("获取当前室内定位的楼层: "+ amapLocation.getFloor() + "\n");
dz.append("获取GPS的当前状态: "+ amapLocation.getGpsAccuracyStatus() + "\n");
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
dz.append("获取定位时间: "+ df.format(date)+ "\n");
location.setText(dz);
// 停止定位
mlocationClient.stopLocation();
} else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
else{
Toast.makeText(getBaseContext(),"定位失败",Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
}
}
@Override
protected void onStop() {
super.onStop();
// 停止定位
if (null != mlocationClient) {
mlocationClient.stopLocation();
}
}
/**
* 销毁定位
*/
private void destroyLocation() {
if (null != mlocationClient) {
/**
* 如果AMapLocationClient是在当前Activity实例化的,
* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
*/
mlocationClient.onDestroy();
mlocationClient = null;
}
}
@Override
protected void onDestroy() {
destroyLocation();
super.onDestroy();
}
}
结果图