2013-11-07 3 views
3

, увидев, что question и ответы (спасибо, кстати) я писал этот код которым в значительной степени так же, как и в ответах:Использование CellSignalStrengthGsm дает только Integer.MAX_VALUE

try { 
     List<CellInfo> cellInfoList = telephonyManager.getAllCellInfo(); 
     for (CellInfo cellInfo : cellInfoList) { 
      if (cellInfo instanceof CellInfoGsm) { 
       CellInfoGsm cellInfoGsm = (CellInfoGsm) cellInfo; 
       CellIdentityGsm cellIdentity = cellInfoGsm.getCellIdentity(); 
       final CellSignalStrengthGsm gsm = ((CellInfoGsm) cellInfo).getCellSignalStrength(); 
       rsrpValue = gsm.getDbm(); 
       pciValue = cellIdentity.getCid(); 
      } else if (cellInfo instanceof CellInfoCdma) { 
       CellInfoCdma cellInfoCdma = (CellInfoCdma) cellInfo; 
       CellIdentityCdma cellIdentity = cellInfoCdma.getCellIdentity(); 
       pciValue = cellIdentity.getBasestationId(); 
      } else if (cellInfo instanceof CellInfoLte){ 
        CellInfoLte cellInfoLte = (CellInfoLte) cellInfo; 
        CellIdentityLte cellIdentity = cellInfoLte.getCellIdentity(); 
        pciValue = cellIdentity.getPci(); 
      } else { 
       throw new Exception("Unknown type of cell signal!"); 
      } 
     } 
    } catch (Exception e) { 
     Log.e(TAG, "Unable to obtain cell signal information", e); 
    } 

Но когда я показываю rsrpValue или pciValue для GSM, я всегда получаю максимальное целочисленное значение (2147483647). Я попробовал это на телефоне с API 17. Что-то не так в моем коде?

Благодаря

+0

Ваш телефон gsm? – njzk2

+0

S4 mini i9195 GSM и LTE. Кроме того, это действительно экземпляр CellInfoGsm, поскольку rsrpValue отображает 2147483647 (Integer.MAX_VALUE), а не 0, когда я его инициализировал. – Grego

+0

Вы пытались получить уровень Асу вместо этого? – njzk2

ответ

1

Попробуйте использовать старый добрый PhoneStateListener слушать изменения интенсивности сигнала. Вот что сработало для меня. Используется для регистрации слушателя:

private TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
int currentSignalStrength = 0; 
int asu = 0; 

telManager.listen(new SignalStrengthListener(), PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 

И это фактический слушатель:

private class SignalStrengthListener extends PhoneStateListener{ 

    @Override 
    public void onSignalStrengthsChanged(SignalStrength signalStrength) 
     { 
      super.onSignalStrengthsChanged(signalStrength); 
      if (telManager.getPhoneType()== TelephonyManager.PHONE_TYPE_CDMA) 
       currentSignalStrength = signalStrength.getCdmaDbm();     
      else 
       asu = signalStrength.getGsmSignalStrength(); 
     } 
    } 

Испытано на Xperia Z, который имеет те же проблемы с использованием CellInfoGsm.

+0

Спасибо, это то, что я сделал для сигнала LTE. Я не знаю, почему, но CellSignalStrengthGsm (или CDMA или LTE) не работает на галактике S4 и S4 mini. Он добавлен с API 17, но не работает на этих устройствах даже с Android 4.2.2, возможно, он будет работать на 4.3 – Grego

+0

На HTC One (Android 4.3) это еще хуже. telephonyManager.getAllCellInfo(); возвращает null ... Это зависит от производителя. Лучшие результаты на Nexus 5 пока. – raspi