我正在开发一个小应用程序,用来检查我所在地区各种网络运营商的信号强度。我目前的运营商信号非常不稳定,我想看看其他GSM运营商的实力。
到目前为止,我一直使用TelephonyManager和带有onSignalStrengthsChanged回调的PhoneStateListener来获取当前网络运营商的GSM信号强度,但这个类似乎只给我提供了关于连接到我的SIM卡的网络信号强度的信息。
我对所有可用的运营商的GSM信号强度的测量感兴趣。搜索网络已经给出了使用内部android类的模糊提示,但我还没有找到任何关于这方面的好例子。
任何可以让我继续获得所有可用的网络运营商及其信号强度的列表的答案都会得到支持。
发布于 2013-05-26 08:21:52
也许这些引用和链接可以帮助您编写自己的解决方案:
1.-获取可用的网络提供商列表(完整引用How to get a list of available network providers? ):
因为安卓是开源的,所以我看了一下源代码,最后找到了一个叫INetworkQueryService.的东西我猜你可以做与android设置实现相同的操作,并与该服务进行交互。通过NetworkSettings.java提供一些指导:
2.-即使是快速阅读NetworkSetting.java和INetworkQueryService interface,也会给我们一个实现目标的想法。
在declaration.中连接服务的
NetworkQueryService的
/** *服务连接代码。*处理绑定到本地对象的工作,以便我们可以进行*适当的服务调用。*/ /**本地服务接口*/私有INetworkQueryService mNetworkQueryService = null;/**服务连接*/私有最终ServiceConnection mNetworkQueryServiceConnection =新ServiceConnection() { /**处理本地对象与服务绑定的任务*/公共无效onServiceConnected(ComponentName className,IBinder服务){ if (DBG) onServiceConnected(“已创建连接,绑定本地服务。”);mNetworkQueryService = ((NetworkQueryService.LocalBinder)服务).getService();//绑定后立即运行查询。loadNetworksList();} /**处理清理本地绑定的任务*/ public void onServiceDisconnected(ComponentName className) { if (DBG) onServiceDisconnected(“连接断开,清理本地绑定”);mNetworkQueryService = null;} };
Intent =新Intent(this,NetworkQueryService.class);...startService (intent);bindService (new Intent(this,NetworkQueryService.class),mNetworkQueryServiceConnection,Context.BIND_AUTO_CREATE);
私有空loadNetworksList() { ... //委托查询服务尝试{ mNetworkQueryService.startNetworkQuery(mCallback);} catch (RemoteException e) {} displayEmptyNetworkList(false);}
评估
/** *此INetworkQueryServiceCallback实现用于接收*来自网络查询服务的回调通知。*/ private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() { /**在查询完成时将消息放在循环队列中。*/ public void onQueryComplete(List networkInfoArray,int status ){ if (DBG) onQueryComplete(“通知消息循环查询完成”);Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED,networkInfoArray,0,networkInfoArray);msg.sendToTarget();} };
私有空networksListLoaded(列表结果,整型状态){ ...if (状态!= NetworkQueryService.QUERY_OK) { ...displayNetworkQueryFailed(状态);displayEmptyNetworkList(真);} else { if (result != null){ displayEmptyNetworkList(假);... } else {displayEmptyNetworkList(真);}
我希望它能帮上忙。我认为这是一个有趣的挑战,所以也许下次我有空闲的时候我会试一试。祝好运!
发布于 2012-05-05 15:39:05
private final PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallForwardingIndicatorChanged(boolean cfi) {
super.onCallForwardingIndicatorChanged(cfi);
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
//checkInternetConnection();
String callState = "UNKNOWN";
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
callState = "IDLE";
break;
case TelephonyManager.CALL_STATE_RINGING:
callState = "Ringing (" + incomingNumber + ")";
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
callState = "Offhook";
break;
}
Log.i("Phone Stats", "onCallStateChanged " + callState);
super.onCallStateChanged(state, incomingNumber);
}
@Override
public void onCellLocationChanged(CellLocation location) {
String cellLocationString = location.toString();
super.onCellLocationChanged(location);
}
@Override
public void onDataActivity(int direction) {
String directionString = "none";
switch (direction) {
case TelephonyManager.DATA_ACTIVITY_IN:
directionString = "IN";
break;
case TelephonyManager.DATA_ACTIVITY_OUT:
directionString = "OUT";
break;
case TelephonyManager.DATA_ACTIVITY_INOUT:
directionString = "INOUT";
break;
case TelephonyManager.DATA_ACTIVITY_NONE:
directionString = "NONE";
break;
default:
directionString = "UNKNOWN: " + direction;
break;
}
Log.i("Phone Stats", "onDataActivity " + directionString);
super.onDataActivity(direction);
}
@Override
public void onDataConnectionStateChanged(int state,int networktype) {
String connectionState = "Unknown";
switch (state ) {
case TelephonyManager.DATA_CONNECTED :
connectionState = "Connected";
break;
case TelephonyManager.DATA_CONNECTING:
connectionState = "Connecting";
break;
case TelephonyManager.DATA_DISCONNECTED:
connectionState = "Disconnected";
break;
case TelephonyManager.DATA_SUSPENDED:
connectionState = "Suspended";
break;
default:
connectionState = "Unknown: " + state;
break;
}
super.onDataConnectionStateChanged(state);
Log.i("Phone Stats", "onDataConnectionStateChanged "
+ connectionState);
}
@Override
public void onMessageWaitingIndicatorChanged(boolean mwi) {
super.onMessageWaitingIndicatorChanged(mwi);
}
@Override
public void onServiceStateChanged(ServiceState serviceState) {
String serviceStateString = "UNKNOWN";
switch (serviceState.getState()) {
case ServiceState.STATE_IN_SERVICE:
serviceStateString = "IN SERVICE";
break;
case ServiceState.STATE_EMERGENCY_ONLY:
serviceStateString = "EMERGENCY ONLY";
break;
case ServiceState.STATE_OUT_OF_SERVICE:
serviceStateString = "OUT OF SERVICE";
break;
case ServiceState.STATE_POWER_OFF:
serviceStateString = "POWER OFF";
break;
default:
serviceStateString = "UNKNOWN";
break;
}
Log.i("Phone Stats", "onServiceStateChanged " + serviceStateString);
super.onServiceStateChanged(serviceState);
}
@Override
public void onSignalStrengthChanged(int asu) {
Log.i("Phone Stats", "onSignalStrengthChanged " + asu);
setSignalLevel( asu);
super.onSignalStrengthChanged(asu);
}
private void setSignalLevel(int level) {
int sLevel = (int) ((level / 31.0) * 100);
Log.i("signalLevel ", "" + sLevel);
}
};
发布于 2015-01-30 23:52:01
由于我没有50个名誉点,以下是我对这个主题的搜索结果:
Alejandro Colorado的解决方案似乎是一个好的解决方案。但问题是,用于实现它的类是为android系统应用程序保留的,即使用与系统相同的签名密钥签名的应用程序。
这怎么可能呢?我找到了两种方法来实现这一点。
第一种方法是在任何一家制造商公司找一份工作,并签署他们的保密协议,但这不是一个真正好的解决方案。特别是当应用程序实现并使用此密钥签名时,只能在compagny的设备上工作。
第二个更有趣,但我警告你,这不是一件容易的事,那就是制作你自己的ROM。您必须创建您的应用程序,将其插入到ROM的/ system /app/目录中,然后重新编译它以使用新系统刷新您的设备。但是有一个问题我还没有回答,那就是无法识别的ROM签名的问题。我认为避免这个问题的最好方法是在你将要使用的恢复中添加你的ROM签名密钥。
这就是我现在所在的地方,也许你会发现这些研究很有用,我希望如此!如果我为你们找到更多的信息,我会稍后再来的。再见。
https://stackoverflow.com/questions/10454388
复制相似问题