Получить SignalStrength без использования PhoneStateListener onSignalStrengthoted

Кто-нибудь знает, как получить уровень сигнала без необходимости вызывать onSignalStrengthChanged. Проблема с onSignalStrengthoted заключается в том, что он вызывается при изменении силы сигнала, и мне нужно получить значение силы сигнала в соответствии с другими критериями.

Заранее спасибо.

3 ответа

Только на уровне API 17, вот код, который можно использовать в Activity (или любой другой Context детский класс):

import android.telephony.CellInfo;
import android.telephony.CellInfoCdma;
import android.telephony.CellInfoGsm;
import android.telephony.CellInfoLte;
import android.telephony.CellSignalStrengthCdma;
import android.telephony.CellSignalStrengthGsm;
import android.telephony.CellSignalStrengthLte;
import android.telephony.TelephonyManager;

try {
    final TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    for (final CellInfo info : tm.getAllCellInfo()) {
        if (info instanceof CellInfoGsm) {
            final CellSignalStrengthGsm gsm = ((CellInfoGsm) info).getCellSignalStrength();
            // do what you need
        } else if (info instanceof CellInfoCdma) {
            final CellSignalStrengthCdma cdma = ((CellInfoCdma) info).getCellSignalStrength();
            // do what you need
        } else if (info instanceof CellInfoLte) {
            final CellSignalStrengthLte lte = ((CellInfoLte) info).getCellSignalStrength();
            // do what you need
        } else {
            throw new Exception("Unknown type of cell signal!");
        }
    }
} catch (Exception e) {
    Log.e(TAG, "Unable to obtain cell signal information", e);
}

Предыдущие версии Android требуют вызова слушателя, другой альтернативы нет (см. Эту ссылку).

Также убедитесь, что ваше приложение содержит соответствующие разрешения.

Исходя из ответа Андре выше, в Kotlin вы можете использовать эту однострочную строку (опять же API 17+):

fun getRadioSignalLevel(): Int {
  return when (val info = telephonyManager.allCellInfo?.firstOrNull()) {
    is CellInfoLte   -> info.cellSignalStrength.level
    is CellInfoGsm   -> info.cellSignalStrength.level
    is CellInfoCdma  -> info.cellSignalStrength.level
    is CellInfoWcdma -> info.cellSignalStrength.level
    else             -> 0
  }
}

Вы можете получить доступ к SignalStrength через рефлексию. Пожалуйста, перейдите по ссылке для реализации http://blog.ajhodges.com/2013/03/reading-lte-signal-strength-rssi-in.html

В Android есть еще один API под названием CellInfo. Но я не уверен, является ли уровень сигнала, возвращаемый OnSignalStrengthsChanged() и CellInfo, одинаковым или нет.

https://developer.android.com/reference/android/telephony/CellSignalStrength.html

Другие вопросы по тегам