Подтвердить что ты не робот

Android: Как получить уровень сигнала GSM для всех доступных сетевых операторов

Я работаю над небольшим приложением, чтобы проверить уровень сигнала различных сетевых операторов в моей области. Мой текущий сигнал операторов довольно нестабилен, и я хочу заглянуть в силу других GSM-операторов.

Sofar Я использовал TelephonyManager и PhoneStateListener с вызовом onSignalStrengthsChanged, чтобы получить силу сигнала GSM для текущего оператора сети, но кажется, что этот класс дает мне информацию о силе сигнала сети, подключенной к моя SIM-карта.

Меня интересует измерение мощности сигнала GSM всех доступных операторов. Поиск в сети дал неопределенные намеки на использование внутренних классов Android, но я пока не нашел хороших примеров.

Любой ответ, который может меня переместить, чтобы получить список всех доступных сетевых операторов, и их уровень сигнала будут устранены.

4b9b3361

Ответ 1

Возможно, эти цитаты и ссылки помогут вам составить собственное решение:

1.- Чтобы получить список доступных сетевых провайдеров (со ссылкой Как получить список доступных сетевых провайдеров? в полном объеме):

Поскольку Android является открытым исходным кодом, я просмотрел источники и, наконец, нашел что-то, называемое INetworkQueryService. Я думаю, вы можете сделать так же, как и настройки настроек Android и взаимодействовать с этим оказание услуг. Некоторые рекомендации через NetworkSettings.java:

  • onCreate запускает NetworkQueryService и связывает его.
  • loadNetworksList() сообщает службе запрос для сетевых операторов.
  • Выполняется оценка INetworkQueryServiceCallback, и если было создано событие EVENT_NETWORK_SCAN_COMPLETED, networkListLoaded будет для итерации по доступным сетям.

2.- Даже быстрое чтение NetworkSetting.java и Интерфейс INetworkQueryService, дает нам идею для достижения вашей цели.

  • Подключить службу в объявлении.
/**
 * 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;
    }
};
  • onCreate запускает NetworkQueryService и связывает его.
Intent intent = new Intent(this, NetworkQueryService.class);
...
startService (intent);
bindService (new Intent(this, NetworkQueryService.class), mNetworkQueryServiceConnection,
                        Context.BIND_AUTO_CREATE);
  • loadNetworksList() сообщает службе запрос для сетевых операторов.
private void loadNetworksList() {
...    
// delegate query request to the service.
try {
    mNetworkQueryService.startNetworkQuery(mCallback);
} catch (RemoteException e) {
}

displayEmptyNetworkList(false); 
}
  • Оценивается INetworkQueryServiceCallback:
/**
 * 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();
    }
};
  • Если событие "EVENT_NETWORK_SCAN_COMPLETED" было поднято, вызовы networkListLoaded будут вызываться для итерации по доступным сетям.
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);
        }
    }
}

Надеюсь, это поможет. Я думаю, что это интересная задача, поэтому, возможно, я попробую в следующий раз, когда у меня будет свободное время. Удачи!

Ответ 2

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

};

Ответ 3

Поскольку у меня нет 50 репутационных очков, вот результат моих поисков по теме:

Решение Алехандро Колорадо кажется хорошим. Но проблема в том, что классы, используемые для ее достижения, зарезервированы для системных приложений Android, то есть приложений, которые подписаны с тем же сигнатурным ключом, что и система.

Как это возможно? Я нашел два способа добиться этого.

Первый заключается в том, чтобы спросить работу у любого производителя compagny и подписать их NDA, но это не очень хорошее решение. Тем более, что приложение, реализованное и подписанное с помощью этого ключа, будет работать только на устройствах из compagny...

Второй, гораздо приятнее, но я предупреждаю вас, что вам будет легко, это сделать свой собственный ПЗУ. Вам нужно будет создать свое приложение, вставить его в каталог /system/app/ROM вашего ПЗУ и перекомпилировать его, чтобы запустить ваше устройство с новой системой. Но вопрос, на который я еще не ответил, - проблема непризнанной подписи ПЗУ. Я думаю, что лучший способ избежать этой проблемы - добавить свой ключ подписи ROM в Recovery, который вы будете использовать.

Что, где я нахожусь в этом пункте, возможно, вы могли бы найти эти исследования полезными, я надеюсь на это! Я вернусь позже, если найду дополнительную информацию для вас, ребята. Bye.

Ответ 4

создать PhoneStateListener и обработать обратный вызов onSignalStrengthChanged. Когда ваше приложение будет инициализировано, оно должно дать вам начальное уведомление. Это в 1.x. в 2.x есть issue об этом.