一、获取高德KEY
首先进入高德控制台,在我的应用中点击"添加key",如下图所示:
其中需要填写的发布版SHA1、调试版SHA1和PackageName获取方式如下:
1.发布版SHA1:
首先需要创建自己项目的发布版SHA1:在Android Studio中build下面点击“Generate Signed Bundle or APK, 选择APK,点击next:
选择Creat new...来创建key,选择好存放目录,并设置密码。next后选择release,点击Finish完成创建
然后找到自己电脑的jdk安装目录,进入./bin文件夹,其中会有keytool.exe,在./bin文件夹中右键鼠标,点击在终端中打开,输入下面“bin>”后面的代码:
E:\java\bin> ./keytool.exe -list -v -keystore D:\自己的key保存目录\自己的key命名.jks
然后输入前面设置的密码,成功获得发布版SHA1。
2.调试版SHA1:
首先找到自己的debug.keystore位置,一般在C盘下的用户目录内:C:\Users\自己的用户名\.android\debug.keystore。
再找到自己电脑的jdk安装目录,进入./bin文件夹,其中会有keytool.exe,在./bin文件夹中右键鼠标,点击在终端中打开,输入下面“bin>”后面的代码:
E:\java\bin> .\keytool.exe -list -v -keystore C:\Users\自己的用户名\.android\debug.keystore
然后输入密码,默认密码为:android,成功获得调试版SHA1。
3.PackageName:
这个在自己的项目中的AndroidManifest.xml获取: package = "所需要的PackageName"
完成上述三步后就得到了高德地图的KEY
二、相关变量定义(随着更新丰富)
在java文件目录的实现类Activity中粘贴
private MapView mMapView = null;
private AMap aMap = null;
private LatLng latLng_me = null;
private boolean firstOpen = true;
三、创建地图
1.应用高德KEY
在AndroidManifest.xml中<application>标签里面粘贴:
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="获取的高德KEY"/>
2.申请权限
在AndroidManifest.xml中<application>标签外面粘贴:(方便起见我把后面会用到的所有权限全部给出)
<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许获取粗略位置,若用GPS实现定位小蓝点功能则必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--允许获取网络状态,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许获取wifi网络信息,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许获取wifi状态改变,用于网络定位,若无gps但仍需实现定位小蓝点功能则此权限必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--允许写入扩展存储,用于数据缓存,若无此权限则写到私有目录-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<!--用与导航状态中保持屏幕常亮-->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
3.创建地图layout
在布局文件activity_layout.xml中粘贴:
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
4.实现地图生命周期
在实现类Activity中粘贴
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
//隐私合规接口
MapsInitializer.updatePrivacyShow(getApplicationContext(), true, true);
MapsInitializer.updatePrivacyAgree(getApplicationContext(), true);
//基础库设置允许采集个人及设备信息
AMapUtilCoreApi.setCollectInfoEnable(true);
//创建地图
mMapView = (MapView) findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
然后运行即可完成创建地图。
四、实现定位
1.动态权限申请(android系统太安全了)
对于现在版本的android,我们需要在实现类Activity中实现启动app时再次申请所需要的权限,在进行定位之前位置粘贴:
//检查权限是否允许(动态申请权限)
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.INTERNET);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_NETWORK_STATE);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_WIFI_STATE);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.CHANGE_WIFI_STATE);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
}
if (ContextCompat.checkSelfPermission(MapActivity_fast.this, Manifest.permission.WAKE_LOCK) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WAKE_LOCK);
}
if (!permissionList.isEmpty()) {
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MapActivity_fast.this, permissions, 1);
}
2.进行定位
//初始化地图控制器对象
aMap = mMapView.getMap();
aMap.setTrafficEnabled(true);// 显示实时交通状况
aMap.getUiSettings().setZoomControlsEnabled(false);//设置地图缩放按钮不显示
aMap.moveCamera(CameraUpdateFactory.zoomTo(16));//设置初始缩放大小
//实现定位监听器
aMap.setOnMyLocationChangeListener(new AMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
//这里返回定位的经纬度
latLng_me = new LatLng(location.getLatitude(), location.getLongitude());
//这里在第一次打开时将地图位置自动定位到自己所在处
if(firstOpen) {
aMap.moveCamera(CameraUpdateFactory.changeLatLng(latLng_me));
firstOpen = false;
}
}
});
//初始化定位蓝点样式类
MyLocationStyle myLocationStyle = new MyLocationStyle();
//连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
//设置连续定位模式下的定位间隔,只在连续定位模式下生效, 单次定位模式下不会生效。单位为毫秒。
myLocationStyle.interval(3000);
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮显示
aMap.setMyLocationEnabled(true);// 设置启动显示定位蓝点
然后运行即可实现定位。