手把手编写儿童手机远程监控App之高德持续定位与单次定位

0 阅读4分钟

概述

上节完成高德地图根据gps划线 嘟宝是为监督孩子身边环境而创建的一套应用,它能够实现后台驻留长连接,随时接收嘟妈信令,建立音视频通道点对点通信,而不需要中转服务器。嘟妈是一套WEB 应用,使用vue3编写,能够兼容app、小程序开发 。而嘟宝采用原生Andorid开发,能够获取最大权限,保持在后台运行。 目前为止,嘟宝完成的基本功能设计包括

  • MQTT 基础通信
  • 后台驻留
  • SQLite数据存储
  • 二维码显示身份识别码
  • 开启自启动前台服务
  • 任务栏消息发送与点击
  • 高德定位实时更新
  • webrtc点对点通信
  • mAgentWeb控件封装解决全屏与获取视频权限问题 嘟妈采用vue3编写它的核心需求已完成包含以下部分:
  • 完成登录注册页面
  • 完成二维码扫描完成与嘟宝绑定
  • 与嘟妈建立音视频通信
  • 查看嘟宝桌面共享视频 项目地址在github上。 嘟宝地址 嘟妈地址
  • 嘟妈想要获取嘟宝的实时定位,嘟妈发送信令给嘟宝获取gps,嘟宝收到信令,定位坐标发送嘟妈
  • 嘟宝首次启动,开启gps定位,将定位信息存储SQLite。

开启连续定位

public class GpsGaode {
    private Handler mWorkHandler;

    AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            updateShow(amapLocation,null);
        }
    };
    Context context;
    public AMapLocationClient mLocationClient = null;
    GpsGaode(){
        this.context=app.getContext();
        HandlerThread handlerThread = new HandlerThread("worker");
        handlerThread.start();
        mWorkHandler = new Handler(handlerThread.getLooper());
        init();
    }
    private void init() {
        mWorkHandler.post(()->{
            //初始化定位
            try {
                AMapLocationClient.updatePrivacyShow(context,true,true);
                AMapLocationClient.updatePrivacyAgree(context,true);
                AMapUtilCoreApi.setCollectInfoEnable(false);

                //参数设置

                AMapLocationClientOption option = new AMapLocationClientOption();
                option.setOnceLocation(false);
                option.setInterval(1000*60);//一分钟
                option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
                mLocationClient = new AMapLocationClient(app.getContext());
                mLocationClient.setLocationOption(option);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //设置定位回调监听
            mLocationClient.setLocationListener(this.mLocationListener);

            //启动定位
            mLocationClient.startLocation();
        });

    }
    

    private void updateShow(AMapLocation amapLocation) {
        if (amapLocation != null) {
            if (amapLocation.getErrorCode() == 0) {
                //解析定位结果
                int type=amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
                double lat=amapLocation.getLatitude();//获取纬度
                double lng=amapLocation.getLongitude();//获取经度
                float acc=amapLocation.getAccuracy();//获取精度信息
                String addr =amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
                String country=amapLocation.getCountry();//国家信息
                String province=amapLocation.getProvince();//省信息
                String city=amapLocation.getCity();//城市信息
                String district=amapLocation.getDistrict();//城区信息
                String street=amapLocation.getStreet();//街道信息
                String streetNum=amapLocation.getStreetNum();//街道门牌号信息
                String cityCode=amapLocation.getCityCode();//城市编码
                String adCode=amapLocation.getAdCode();//地区编码
                String aoiName=amapLocation.getAoiName();//获取当前定位点的AOI信息
                String buildingId=amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
                String floor=amapLocation.getFloor();//获取当前室内定位的楼层
                int accuracyStatus=amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
                long dtime=amapLocation.getTime();
                ContentValues values = new ContentValues();
                values.put("type",type);
                values.put("lat",lat);
                values.put("lng",lng);
                values.put("acc",acc);
                values.put("addr",addr);
                values.put("country",country);
                values.put("province",province);
                values.put("city",city);
                values.put("district",district);
                values.put("street",street);
                values.put("streetNum",streetNum);
                values.put("cityCode",cityCode);
                values.put("adCode",adCode);
                values.put("aoiName",aoiName);
                values.put("buildingId",buildingId);
                values.put("floor",floor);
                values.put("accuracyStatus",accuracyStatus);
                values.put("dtime",dtime);
                MyDB myDB=new MyDB();
                SQLiteDatabase db =myDB.getWritableDatabase();
                db.beginTransaction();
                try {
                    // 执行多个数据库操作
                    db.insert("gps",null,values);
                    db.setTransactionSuccessful();
                } catch (Exception e) {
                    // 发生异常,自动回滚
                    e.printStackTrace();
                }finally {
                    db.endTransaction();
                    db.close();
                }
             
            }
        }
    }

定位一次

public class GpsGaode {
    private Handler mWorkHandler;

    
    
    public void onceLocation(MyMqttClient.Msg msg) {
        mWorkHandler.post(()->{
            //初始化定位
            try {
                AMapLocationClient.updatePrivacyShow(context,true,true);
                AMapLocationClient.updatePrivacyAgree(context,true);
                AMapUtilCoreApi.setCollectInfoEnable(false);

                //参数设置

                AMapLocationClientOption option = new AMapLocationClientOption();
                option.setOnceLocation(true);
                // 定位模式:
                //- Hight_Accuracy:高精度(GPS + 网络)
                //- Battery_Saving:省电(仅网络)
                //- Device_Sensors:仅设备(仅 GPS)
                option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);


                mLocationClient = new AMapLocationClient(app.getContext());
                mLocationClient.setLocationOption(option);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //设置定位回调监听
            mLocationClient.setLocationListener(new AMapLocationListener() {
                @Override
                public void onLocationChanged(AMapLocation aMapLocation) {
                    updateShow(aMapLocation,msg);
                }
            });

            //启动定位
            mLocationClient.startLocation();
        });

    }


    private void updateShow(AMapLocation amapLocation,MyMqttClient.Msg msg) {
        if (amapLocation != null) {
            if (amapLocation.getErrorCode() == 0) {
                //解析定位结果
                int type=amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
                double lat=amapLocation.getLatitude();//获取纬度
                double lng=amapLocation.getLongitude();//获取经度
                float acc=amapLocation.getAccuracy();//获取精度信息
                String addr =amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
                String country=amapLocation.getCountry();//国家信息
                String province=amapLocation.getProvince();//省信息
                String city=amapLocation.getCity();//城市信息
                String district=amapLocation.getDistrict();//城区信息
                String street=amapLocation.getStreet();//街道信息
                String streetNum=amapLocation.getStreetNum();//街道门牌号信息
                String cityCode=amapLocation.getCityCode();//城市编码
                String adCode=amapLocation.getAdCode();//地区编码
                String aoiName=amapLocation.getAoiName();//获取当前定位点的AOI信息
                String buildingId=amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
                String floor=amapLocation.getFloor();//获取当前室内定位的楼层
                int accuracyStatus=amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
                long dtime=amapLocation.getTime();
                ContentValues values = new ContentValues();
                values.put("type",type);
                values.put("lat",lat);
                values.put("lng",lng);
                values.put("acc",acc);
                values.put("addr",addr);
                values.put("country",country);
                values.put("province",province);
                values.put("city",city);
                values.put("district",district);
                values.put("street",street);
                values.put("streetNum",streetNum);
                values.put("cityCode",cityCode);
                values.put("adCode",adCode);
                values.put("aoiName",aoiName);
                values.put("buildingId",buildingId);
                values.put("floor",floor);
                values.put("accuracyStatus",accuracyStatus);
                values.put("dtime",dtime);
                MyDB myDB=new MyDB();
                SQLiteDatabase db =myDB.getWritableDatabase();
                db.beginTransaction();
                try {
                    // 执行多个数据库操作
                    db.insert("gps",null,values);
                    db.setTransactionSuccessful();
                } catch (Exception e) {
                    // 发生异常,自动回滚
                    e.printStackTrace();
                }finally {
                    db.endTransaction();
                    db.close();
                }
                pushmqttgps(msg);
            }
        }
    }

结合嘟妈查看效果

在这里插入图片描述