Android手把手编写儿童手机远程监控App之高德定位

0 阅读4分钟

概述

上节讲述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 值:

  1. 切换到 debug.keystore 文件所在目录(通常位于 C:\Users\用户名\.android\)。
  2. 执行以下命令:
    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();

    }
}

        

运行之前,需要到应用中将权限允许,否则闪退 运行如下: 在这里插入图片描述