概述
上节讲述GPS基础内容,奈何发布失败。使用Android 原生GPS api,获取地理位置,是无法在室内获取。原因在于室内GPS信号弱,检测不到卫星。 对于4G定位与WIFI定位,由于google框架被拆除,或者网络不通达。无法使用。 这节讲讲如何通过高德定位api来解决这些问题。
嘟宝工程配置
使用高德定位api,首先需要申请key。API对个人开发者是收费的,但提供了每月1万次的免费调用额度。文档地址 申请key,需要指明嘟宝工程的包名,调试版本与发布版本的Sha1
获取嘟宝工程Sha1
官方文档。获取Sha1值,与apk的签名有关。apk签名分两类
- debug签名
- release签名
debug签名是系统默认的,它在Android studio默认位置在,
C:\Users\zilong\.android目录下,文件名为debug.keystore,其中zilong是计算机的用户名。如下图release签名是自己创建的签名,属于个人拥有。嘟宝apk完成后发布之前,需创建签名。
release签名
点击菜单build > Generate Signed Bundle/apk,如下图
如下选择
选择Create new 创建新的签名
如下添加,请记住所所填写信息、密码
点击ok,生成srt8500.jks文件,该文件为生成Sha1必须文件
生成Sha1
工欲善其事必先利其器,keytool工具,若没有则要先配置 Java 环境变量。输入如下命令
keytool -version
执行上述命令,若能看到版本信息,则说明工具已就绪。如下图所示:
接下来,我们分别获取调试(debug)和发布(release)签名的 SHA1 值。
获取调试签名 SHA1 值:
- 切换到
debug.keystore文件所在目录(通常位于C:\Users\用户名\.android\)。 - 执行以下命令:
命令执行过程如下图所示:keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android如图,红框内sha1,所要的值
同理切换到release签名所在文件夹下,获取它的签名,注意此时需要输入签名的密码
获取高德定位key
登录高德地址,打开控制台,找到如下图
点击创建新应用,如下图
选择新建。
如下图,选择添加key
如下图,将事先准备好的sha1填入
点击提交,如下图,生成的key。
配置嘟宝
高德库引用
下载地址,在build.gradle文件中引用库
implementation(fileTree(dir:"libs",include:['AMap3DMap_10.0.700_AMapSearch_9.7.2_AMapLocation_6.4.5_20240508.jar']))
如下图
key配置
AndroidManifest.xml文件中,application标签内添加
!-- // 高德api-->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="96d9b78a9xxxxxxxxx73e50f94980" /> <!-- 定位需要的服务 适配Android Q需要加上android:foregroundServiceType="location" -->
<service
android:name="com.amap.api.location.APSService"
android:foregroundServiceType="location" />
meta-data标签内value是申请的key
定位权限声明
AndroidManifest.xml文件中
<!-- 权限高德定位(必须) -->
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
至此工程配置完成,接下来写hello world
获取当前位置
- 在MainActivity主页面添加函数initGaoDeGPS
- 在onCreate函数内调用initGaoDeGPS
- 在initGaoDeGPS初始化,获取经纬度 代码如下
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initGaoDeGPS();
}
public AMapLocationClient mLocationClient = null;
private void initGaoDeGPS(){
try {
AMapLocationClient.updatePrivacyShow(this,true,true);
AMapLocationClient.updatePrivacyAgree(this,true);
AMapUtilCoreApi.setCollectInfoEnable(false);
//参数设置
AMapLocationClientOption option = new AMapLocationClientOption();
option.setOnceLocation(true);
mLocationClient = new AMapLocationClient(app.getContext());
mLocationClient.setLocationOption(option);
} catch (Exception e) {
e.printStackTrace();
}
//设置定位回调监听
mLocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
double lat=aMapLocation.getLatitude();
double longitude=aMapLocation.getLatitude();
double Longitude=aMapLocation.getLongitude();
String city=aMapLocation.getCity();
String s="经度"+lat+"纬度"+longitude+""+city;
Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
}
});
//启动定位
mLocationClient.startLocation();
}
}
运行之前,需要到应用中将权限允许,否则闪退
运行如下: