GPS北斗双模技术应用开发研究—应用数据交互
2014-12-11 20:29
495 查看
GPS北斗双模技术应用开发研究—应用数据交互
Android开发原则就是谁对哪个数据感兴趣就可以通过listener去监听一下,那边定位数据肯定也是这样的,关于位置上报的话,笔者不准备在这累赘了,网上好多文章,下面就讲一下双模相关的北斗gps卫星星图搜星具体情况的数据上报以及私有协议的定制。
在locationmanager里面有一个接口addGpsStatusListener,在应用里通过这个接口把listen传下去,这中间有很多过程,最终这个listener在location的provider里面存了起来,中间被service转了一手,但是service里面是直接用的provider的addGpsStatusListener。下面可以看看service里面的addGpsStatusListener接口情况,如下:
public boolean addGpsStatusListener(IGpsStatusListener listener, String packageName) {
if (mGpsStatusProvider == null) {
return false;
}
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel,
LocationManager.GPS_PROVIDER);
final int uid = Binder.getCallingUid();
final long ident = Binder.clearCallingIdentity();
try {
if (!checkLocationAccess(uid, packageName, allowedResolutionLevel)) {
return false;
}
} finally {
Binder.restoreCallingIdentity(ident);
}
try {
mGpsStatusProvider.addGpsStatusListener(listener);
} catch (RemoteException e) {
Slog.e(TAG, "mGpsStatusProvider.addGpsStatusListener failed", e);
return false;
}
return true;
} 这里就注册下去了。这样就相当于在provider里面就挂了个钩子了,一旦有新数据更新就可以直接传到应用里面了,当然这个listener中间转的那几手有兴趣的可以去看看代码,都不难看懂的。那看看卫星sv状态上报吧,直接触发了listener的onSvStatusChanged接口,如下:
private void reportSvStatus() {
int svCount = native_read_sv_status(mSvs, mSnrs, mSvElevations, mSvAzimuths, mSvMasks);
synchronized (mListeners) {
int size = mListeners.size();
for (int i = 0; i < size; i++) {
Listener listener = mListeners.get(i);
try {
listener.mListener.onSvStatusChanged(svCount, mSvs, mSnrs,
mSvElevations, mSvAzimuths, mSvMasks[EPHEMERIS_MASK],
mSvMasks[ALMANAC_MASK], mSvMasks[USED_FOR_FIX_MASK],
mSvMasks[BD_SVS_NUM], mSvMasks[BD_EPHEMERIS_MASK],
mSvMasks[BD_ALMANAC_MASK],mSvMasks[BD_USED_FOR_FIX_MASK]);
} catch (RemoteException e) {
Log.w(TAG, "RemoteException in reportSvInfo");
mListeners.remove(listener);
// adjust for size of list changing
size--;
}
}
} 这样就call到了GpsStatusListenerTransport里面的onSvStatusChanged了,在这里面要下点文章,它会发送一个GpsStatus.GPS_EVENT_SATELLITE_STATUS的消息,但是没有带参数,笔者就把两个参数利用起来了,一个存gps的数量,一个存北斗的数量。这个消息发送出去以后,会在他的handle里面处理转换一次。
private final Handler mGpsHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == NMEA_RECEIVED) {
synchronized (mNmeaBuffer) {
int length = mNmeaBuffer.size();
for (int i = 0; i < length; i++) {
Nmea nmea = mNmeaBuffer.get(i);
mNmeaListener.onNmeaReceived(nmea.mTimestamp, nmea.mNmea);
}
mNmeaBuffer.clear();
}
} else {
// synchronize on mGpsStatus to ensure the data is copied atomically.
synchronized(mGpsStatus) {
if(GpsStatus.GPS_EVENT_SATELLITE_STATUS == msg.what){
int pri_event ;
pri_event = 0x77 + (msg.arg1<<8) + (msg.arg2<<16);
//Log.d(TAG, "LM: msg.arg1 "+msg.arg1 +" msg.arg2 "+msg.arg2+ " pri "+pri_event);
mListener.onGpsStatusChanged(pri_event);
}
mListener.onGpsStatusChanged(msg.what);
}
}
} 因此,在转发消息的时候做一下特殊处理,合成一个特殊的消息,带上我们的gps数量北斗数量,其他没有什么特别的了,第三方应用同样也可以收到sv的变化,只是不知道gps跟北斗具体的数量。其他没有差异。
Android开发原则就是谁对哪个数据感兴趣就可以通过listener去监听一下,那边定位数据肯定也是这样的,关于位置上报的话,笔者不准备在这累赘了,网上好多文章,下面就讲一下双模相关的北斗gps卫星星图搜星具体情况的数据上报以及私有协议的定制。
在locationmanager里面有一个接口addGpsStatusListener,在应用里通过这个接口把listen传下去,这中间有很多过程,最终这个listener在location的provider里面存了起来,中间被service转了一手,但是service里面是直接用的provider的addGpsStatusListener。下面可以看看service里面的addGpsStatusListener接口情况,如下:
public boolean addGpsStatusListener(IGpsStatusListener listener, String packageName) {
if (mGpsStatusProvider == null) {
return false;
}
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel,
LocationManager.GPS_PROVIDER);
final int uid = Binder.getCallingUid();
final long ident = Binder.clearCallingIdentity();
try {
if (!checkLocationAccess(uid, packageName, allowedResolutionLevel)) {
return false;
}
} finally {
Binder.restoreCallingIdentity(ident);
}
try {
mGpsStatusProvider.addGpsStatusListener(listener);
} catch (RemoteException e) {
Slog.e(TAG, "mGpsStatusProvider.addGpsStatusListener failed", e);
return false;
}
return true;
} 这里就注册下去了。这样就相当于在provider里面就挂了个钩子了,一旦有新数据更新就可以直接传到应用里面了,当然这个listener中间转的那几手有兴趣的可以去看看代码,都不难看懂的。那看看卫星sv状态上报吧,直接触发了listener的onSvStatusChanged接口,如下:
private void reportSvStatus() {
int svCount = native_read_sv_status(mSvs, mSnrs, mSvElevations, mSvAzimuths, mSvMasks);
synchronized (mListeners) {
int size = mListeners.size();
for (int i = 0; i < size; i++) {
Listener listener = mListeners.get(i);
try {
listener.mListener.onSvStatusChanged(svCount, mSvs, mSnrs,
mSvElevations, mSvAzimuths, mSvMasks[EPHEMERIS_MASK],
mSvMasks[ALMANAC_MASK], mSvMasks[USED_FOR_FIX_MASK],
mSvMasks[BD_SVS_NUM], mSvMasks[BD_EPHEMERIS_MASK],
mSvMasks[BD_ALMANAC_MASK],mSvMasks[BD_USED_FOR_FIX_MASK]);
} catch (RemoteException e) {
Log.w(TAG, "RemoteException in reportSvInfo");
mListeners.remove(listener);
// adjust for size of list changing
size--;
}
}
} 这样就call到了GpsStatusListenerTransport里面的onSvStatusChanged了,在这里面要下点文章,它会发送一个GpsStatus.GPS_EVENT_SATELLITE_STATUS的消息,但是没有带参数,笔者就把两个参数利用起来了,一个存gps的数量,一个存北斗的数量。这个消息发送出去以后,会在他的handle里面处理转换一次。
private final Handler mGpsHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == NMEA_RECEIVED) {
synchronized (mNmeaBuffer) {
int length = mNmeaBuffer.size();
for (int i = 0; i < length; i++) {
Nmea nmea = mNmeaBuffer.get(i);
mNmeaListener.onNmeaReceived(nmea.mTimestamp, nmea.mNmea);
}
mNmeaBuffer.clear();
}
} else {
// synchronize on mGpsStatus to ensure the data is copied atomically.
synchronized(mGpsStatus) {
if(GpsStatus.GPS_EVENT_SATELLITE_STATUS == msg.what){
int pri_event ;
pri_event = 0x77 + (msg.arg1<<8) + (msg.arg2<<16);
//Log.d(TAG, "LM: msg.arg1 "+msg.arg1 +" msg.arg2 "+msg.arg2+ " pri "+pri_event);
mListener.onGpsStatusChanged(pri_event);
}
mListener.onGpsStatusChanged(msg.what);
}
}
} 因此,在转发消息的时候做一下特殊处理,合成一个特殊的消息,带上我们的gps数量北斗数量,其他没有什么特别的了,第三方应用同样也可以收到sv的变化,只是不知道gps跟北斗具体的数量。其他没有差异。
相关文章推荐
- GPS北斗双模技术应用开发研究--数据解析
- GPS北斗双模技术应用开发研究--几个基本关键词
- GPS北斗双模技术应用开发研究--几个基本关键词
- GPS北斗双模技术应用开发研究—数据结构扩展
- GPS北斗双模技术应用开发研究—数据结构扩展
- GPS北斗双模技术应用开发研究--数据解析
- JavaWeb开发中Ajax技术、json与java实现List、Map数据直接传递的研究
- 基于组件GIS、GPS及SMS技术的车辆监控调度系统的应用开发
- 结合Rexsee、Jquery、PHP开发移动应用时的数据交互问题
- EMV技术学习和研究(三)应用初始化&&读应用数据
- Android应用-开发技术【数据缓存】
- 软件系统开发中的组件框架技术研究、设计和应用[转]
- ArcView GIS 应用与开发技术(9)- 创建空间数据
- 产品设计:Android应用-开发技术【数据缓存】
- 产品设计:Android应用-开发技术【数据缓存】
- VB之数据报表设计器在多层结构开发的应用---技术在更新,而思路则不变
- 软件系统开发中的组件框架技术研究、设计和应用
- 产品设计:Android应用-开发技术【数据缓存】
- ArcView GIS 应用与开发技术(8)- 利用空间关系累加数据
- 数据研究在交互设计中的应用