场景说明:我们给自来水公司开发了一个h5应用,需要对接第三方厂家支持硬件设备以便于获取到高精度定位数据,之前几篇文件写过,我已经集成过南方测绘RTK和高精度定位模块的设备,厂商自己基本都有工具应用连接卫星并解析数据,这样我们就利用这点,让厂商讲获取的数据通过广播定时发送出来,在我们的h5应用中接受广播并获取数据即可,这样我们只需要开发一个通用的插件即可实现。
timer = new Timer();
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
timer.schedule(new TimerTask() {
@Override
public void run() {
sendData();
}
}, 1000, 1000);
}
});
stop = (Button)findViewById(R.id.stop);
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
count = 0;
stopTimer();
}
});
public void sendData(){
++count;
Intent intent = new Intent(ACTION_CUSTOM_BROADCAST);
intent.putExtra("Latitude",lat.getText().toString());
intent.putExtra("Longitude",lon.getText().toString());
intent.putExtra("Altitude",alt.getText().toString());
intent.putExtra("state","单点解"+count);
intent.setPackage("com.xxx.xxxx");
sendBroadcast(intent);
}
private void stopTimer(){
if(timer != null){
timer = null;
}
}
Demo中定义两个按钮一个发送一个停止发送,加个定时器不停发送便于模拟真实情况。
基于插件二的功能做的测试,简单的改了下即可获取。
public class ComRTKReceiver extends BroadcastReceiver {
public static final String ACTION_CUSTOM_BROADCAST = "rtkBroadCast";
double latitude,longitude,altitude;
Context mContext;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_CUSTOM_BROADCAST)) {
String lat = intent.getStringExtra("Latitude");
latitude = Double.parseDouble(lat);
RTKlocationManager.rtkLat = latitude;
String lon = intent.getStringExtra("Longitude");
longitude = Double.parseDouble(lon);
RTKlocationManager.rtkLon = longitude;
String alt = intent.getStringExtra("Altitude");
altitude = Double.parseDouble(alt);
RTKlocationManager.rtkAlt = altitude;
String str = intent.getStringExtra("state");
RTKlocationManager.rtkGpsState = str;
}
}
}
ComRTKReceiver 路径为com.xxx.xxx,根据这个路径在xml文件中增加广播的静态注册
如果项目中能用动态注册还是用动态注册比较好,Android8.0之后对静态注册非系统广播有了更严格的限制,发送广播的时候需要传递接受广播的包名才能在固定的应用中收到 intent.setPackage(“com.xxx.xxxx”),我的项目插件是cordova插件,在插件中没法动态注册广播,即使在原生的壳中注册成功了,获取到数据之后也不方便传递到页面中,动态广播注册可以用如下方式
registerGpsDataReceiver();
private void registerGpsDataReceiver() {
if (mGpsDataBroadcastReceiver != null) {
unregisterGpsDataReceiver();
}
mGpsDataBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_CUSTOM_BROADCAST)) {
String lat = intent.getStringExtra("Latitude");
String lon = intent.getStringExtra("Longitude");
String alt = intent.getStringExtra("Altitude");
String str = intent.getStringExtra("state");
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_CUSTOM_BROADCAST);
registerReceiver(mGpsDataBroadcastReceiver, intentFilter);
}
private void unregisterGpsDataReceiver() {
if (mGpsDataBroadcastReceiver != null) {
unregisterReceiver(mGpsDataBroadcastReceiver);
mGpsDataBroadcastReceiver = null;
}
}
let res = await this.utilTools.settingRTKLocation(this.obj)
console.log("res:" + JSON.stringify(res))
模拟的按钮点击数据为{ id: 6, name: ‘广播测试’, value: ‘broadcastTest’, img: ‘’ }
插件关键代码入口
if("settingRTKLocation".equals(action)){
message = args.getJSONObject(0);
delayTime = message.getInt("delayTime");
intervalTime = message.getInt("intervalTime");
isKeepCallBack = message.getBoolean("isKeepCallBack")||false;
paramKey = message.getString("paramKey");
this.goPageByParam(callbackContext,paramKey);
return true;
}
goPageByParam中根据key不同执行不同的获取数据方法
private void goPageByParam(CallbackContext callbackContext, String key){
singleLocaitonCC = callbackContext;
switch (key) {
case "broadcastTest":
try {
getBroadCastData();
} catch (JSONException e) {
e.printStackTrace();
}
break;
}
}
getBroadCastData中返回坐标等参数
private void getBroadCastData() throws JSONException {
JSONObject json = new JSONObject();
json.put("latitude",rtkLat);
json.put("longitude",rtkLon);
json.put("altitude",rtkAlt);
json.put("hrms",hrms);
json.put("vrms",vrms);
json.put("rms",rms);
json.put("type","rtkGps");
json.put("gpsStatue",gpsStatue);
json.put("gpsStatueStr",rtkGpsState);
json.put("code", "200");
PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, json);
singleLocaitonCC.sendPluginResult(pluginResult);
}