概述
上节完成高德地图根据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);
}
}
}