Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何获得所有可用网络运营商的GSM信号强度_Android_Operators_Gsm_Signal Strength - Fatal编程技术网

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

Android:如何获得所有可用网络运营商的GSM信号强度,android,operators,gsm,signal-strength,Android,Operators,Gsm,Signal Strength,我正在开发一个小应用程序来检查我所在地区各种网络运营商的信号强度。我目前的运营商信号非常不稳定,我想了解其他GSM运营商的实力 到目前为止,我一直在使用TelephonyManager和PhoneStateListener以及OnSignalStrengthChanged回拨来获取当前网络运营商的GSM信号强度,但这个类似乎只给我提供连接到SIM卡的网络信号强度的信息 我对测量所有可用运营商的GSM信号强度感兴趣。搜索网络给出了使用内部android类的模糊提示,但我还没有找到任何好的例子 任何

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

到目前为止,我一直在使用TelephonyManager和PhoneStateListener以及OnSignalStrengthChanged回拨来获取当前网络运营商的GSM信号强度,但这个类似乎只给我提供连接到SIM卡的网络信号强度的信息

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


任何能让我继续获取所有可用网络运营商及其信号强度列表的答案都会被告知。

创建一个PhoneStateListener并处理onSignalStrengthChanged回调。当你的应用程序初始化时,它会给你一个初始通知。这是在1.x中。在2.x中,有一个开放的解决方案。

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

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);
    }

};
1.-要获得完整报价的可用网络提供商列表:

由于Android是开源的,我看了一下源代码,最后 找到一个名为INetworkQueryService的东西。我想你能做到 与android设置实现相同,并与此交互 服务通过NetworkSettings.java提供一些指导:

onCreate启动NetworkQueryService并将其绑定。 loadNetworksList告诉服务查询网络运营商。 将计算INetworkQueryServiceCallback,如果引发事件“网络扫描完成”,则将加载networksListLoaded 调用以在可用网络上迭代。 2.-即使是快速阅读和,也会给我们一个实现您目标的想法

在声明中连接服务。 onCreate启动NetworkQueryService并将其绑定。 loadNetworksList告诉服务查询网络运营商。 对INetworkQueryServiceCallback进行评估: 如果引发事件“网络扫描完成”,将调用networksListLoaded在可用网络上迭代。
我希望有帮助。我认为这是一个有趣的挑战,所以也许下次我有空的时候我会尝试一下。祝你好运

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

亚历杭德罗·科罗拉多的解决方案似乎是好的。但问题是,用于实现它的类是为android系统应用程序保留的,即使用与系统相同的签名密钥签名的应用程序

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

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

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

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

谢谢你的快速回答。我已经试过了,如上所述,它只给我当前网络运营商信号的信号强度。我对所有可用运营商及其当前信号强度的完整列表感兴趣。我从未尝试过这些,我会搜索,如果我找到任何答案,我会在这里发布。whar是我对所有可用运营商及其当前信号强度的完整列表感兴趣的意思。?完整列表指的是手机上所有可用的网络运营商当前位置。感谢您的回复,但此代码将“仅”提供订阅网络的信息,我还对该地区其他提供商的信号强度感兴趣。意思是当您搜索网络时,运营商显示在列表中,您想知道所有显示的运营商的网络强度。我说得对吗???没错,我想查看所有可能的网络运营商的列表,以及我目前所在的位置。很好,很简单嗨,您得到这个问题的答案了吗?如果有,请给出一些示例?我需要与你相同的要求..我知道这是一个旧线程,但你完成了你的应用程序吗?可以下载到其他地方吗?你好@Schwartz,我正在寻找同样的需求。你找到解决办法了吗?。任何付费/免费API,如果您可以建议的话。您如何导入INetworkQueryServic之类的项目
E我找不到eclipse能够识别的路径。抱歉,今天无法尝试,但是如果import com.android.phone.INetworkQueryService不起作用,您可以复制代码并使用相同的原则创建自己的解决方案,这就是我在回答中试图说的。这正是我所做的:我从头开始创建了一个活动,并使用了您建议的代码。然而,所提到的很多类,例如INetworkQueryService和NetworkQueryService都没有被识别,eclipse无法找到它们的导入,并且无法解决导入com.android.phone.INetworkQueryService导致导入com.android.phone的明显猜测。你有什么建议?在我能想象的范围内,你不能导入com.android.phone,但你可以访问源代码。在我的回答中,我建议您创建自己的解决方案,复制并修改它以满足您的需要。我尝试这么做已经一个多月了,我不知道这个假设是如何设置为正确答案还是175分。有人试过了?工作?我不能拥有NetworkQueryService的实例,因为它是一个内部类,为此我应该使用一个包含该类实例的对象,顺便说一句,我不知道在哪里可以找到它,或者是否真的可以找到它。请帮我搜索一下。
/**
 * Service connection code for the NetworkQueryService.
 * Handles the work of binding to a local object so that we can make
 * the appropriate service calls.
 */

/** Local service interface */
private INetworkQueryService mNetworkQueryService = null;

/** Service connection */
private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() {

    /** Handle the task of binding the local object to the service */
    public void onServiceConnected(ComponentName className, IBinder service) {
        if (DBG) log("connection created, binding local service.");
        mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService();
        // as soon as it is bound, run a query.
        loadNetworksList();
    }

    /** Handle the task of cleaning up the local binding */
    public void onServiceDisconnected(ComponentName className) {
        if (DBG) log("connection disconnected, cleaning local binding.");
        mNetworkQueryService = null;
    }
};
Intent intent = new Intent(this, NetworkQueryService.class);
...
startService (intent);
bindService (new Intent(this, NetworkQueryService.class), mNetworkQueryServiceConnection,
                        Context.BIND_AUTO_CREATE);
private void loadNetworksList() {
...    
// delegate query request to the service.
try {
    mNetworkQueryService.startNetworkQuery(mCallback);
} catch (RemoteException e) {
}

displayEmptyNetworkList(false); 
}
/**
 * This implementation of INetworkQueryServiceCallback is used to receive
 * callback notifications from the network query service.
 */
private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() {

    /** place the message on the looper queue upon query completion. */
    public void onQueryComplete(List<OperatorInfo> networkInfoArray, int status) {
        if (DBG) log("notifying message loop of query completion.");
        Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED,
                status, 0, networkInfoArray);
        msg.sendToTarget();
    }
};
private void networksListLoaded(List<OperatorInfo> result, int status) {
    ...

    if (status != NetworkQueryService.QUERY_OK) {
        ...
        displayNetworkQueryFailed(status);
        displayEmptyNetworkList(true);
    } else {
        if (result != null){
            displayEmptyNetworkList(false);
            ...
        } else {
            displayEmptyNetworkList(true);
        }
    }
}