首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:如何获得所有可用的网络运营商的GSM信号强度

Android:如何获得所有可用的网络运营商的GSM信号强度
EN

Stack Overflow用户
提问于 2012-05-05 02:39:50
回答 4查看 38.9K关注 0票数 43

我正在开发一个小应用程序,用来检查我所在地区各种网络运营商的信号强度。我目前的运营商信号非常不稳定,我想看看其他GSM运营商的实力。

到目前为止,我一直使用TelephonyManager和带有onSignalStrengthsChanged回调的PhoneStateListener来获取当前网络运营商的GSM信号强度,但这个类似乎只给我提供了关于连接到我的SIM卡的网络信号强度的信息。

我对所有可用的运营商的GSM信号强度的测量感兴趣。搜索网络已经给出了使用内部android类的模糊提示,但我还没有找到任何关于这方面的好例子。

任何可以让我继续获得所有可用的网络运营商及其信号强度的列表的答案都会得到支持。

EN

回答 4

Stack Overflow用户

发布于 2013-05-26 08:21:52

也许这些引用和链接可以帮助您编写自己的解决方案:

1.-获取可用的网络提供商列表(完整引用How to get a list of available network providers? ):

因为安卓是开源的,所以我看了一下源代码,最后找到了一个叫INetworkQueryService.的东西我猜你可以做与android设置实现相同的操作,并与该服务进行交互。通过NetworkSettings.java提供一些指导:

  • onCreate启动NetworkQueryService并绑定it.
  • loadNetworksList(),通知服务查询网络operators.
  • INetworkQueryServiceCallback,如果引发事件"EVENT_NETWORK_SCAN_COMPLETED“,将调用networksListLoaded在可用网络上迭代。

2.-即使是快速阅读NetworkSetting.javaINetworkQueryService 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;} };

  • onCreate启动NetworkQueryService并对其进行绑定。

Intent =新Intent(this,NetworkQueryService.class);...startService (intent);bindService (new Intent(this,NetworkQueryService.class),mNetworkQueryServiceConnection,Context.BIND_AUTO_CREATE);

  • loadNetworksList()通知服务查询网络运营商。

私有空loadNetworksList() { ... //委托查询服务尝试{ mNetworkQueryService.startNetworkQuery(mCallback);} catch (RemoteException e) {} displayEmptyNetworkList(false);}

评估

  • INetworkQueryServiceCallback:

/** *此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();} };

  • 如果引发了事件"EVENT_NETWORK_SCAN_COMPLETED“,则将调用networksListLoaded以迭代可用网络。

私有空networksListLoaded(列表结果,整型状态){ ...if (状态!= NetworkQueryService.QUERY_OK) { ...displayNetworkQueryFailed(状态);displayEmptyNetworkList(真);} else { if (result != null){ displayEmptyNetworkList(假);... } else {displayEmptyNetworkList(真);}

我希望它能帮上忙。我认为这是一个有趣的挑战,所以也许下次我有空闲的时候我会试一试。祝好运!

票数 23
EN

Stack Overflow用户

发布于 2012-05-05 15:39:05

代码语言:javascript
运行
复制
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);
    }

};
票数 2
EN

Stack Overflow用户

发布于 2015-01-30 23:52:01

由于我没有50个名誉点,以下是我对这个主题的搜索结果:

Alejandro Colorado的解决方案似乎是一个好的解决方案。但问题是,用于实现它的类是为android系统应用程序保留的,即使用与系统相同的签名密钥签名的应用程序。

这怎么可能呢?我找到了两种方法来实现这一点。

第一种方法是在任何一家制造商公司找一份工作,并签署他们的保密协议,但这不是一个真正好的解决方案。特别是当应用程序实现并使用此密钥签名时,只能在compagny的设备上工作。

第二个更有趣,但我警告你,这不是一件容易的事,那就是制作你自己的ROM。您必须创建您的应用程序,将其插入到ROM的/ system /app/目录中,然后重新编译它以使用新系统刷新您的设备。但是有一个问题我还没有回答,那就是无法识别的ROM签名的问题。我认为避免这个问题的最好方法是在你将要使用的恢复中添加你的ROM签名密钥。

这就是我现在所在的地方,也许你会发现这些研究很有用,我希望如此!如果我为你们找到更多的信息,我会稍后再来的。再见。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10454388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档