PhoneStateListener — чего ожидать от onCellInfoChanged?

Я опубликовал это в группе разработчиков Android. Я надеюсь получить отзыв здесь.

Обратные вызовы onCellLocationChanged и onSignalStrengthsChanged PhoneStateListener были методами goto, когда я хотел обработать изменения данных ячеек и сигналов в GSM и CDMA. С API 17+ я вижу, что есть новый обратный вызов (onCellInfoChanged) для обработки изменений как ячеек, так и сигналов.

Глядя на документацию, неясно, чего я могу ожидать от введения этого нового обратного вызова.

  • Будет ли LTE всегда меняться и вызывать только onCellInfoChanged?
  • Останутся ли изменения GSM/CDMA в старых обратных вызовах?
  • Одно пересекается с другим? (т. е. как старый, так и новый запускаются для LTE или GSM/CDMA.)

Вполне может быть, что разные OEM-производители будут иметь разные реализации (вздох!), но я надеюсь, что есть рекомендации, которым все должны следовать.

Может кто-нибудь пролить некоторый свет на это?

Спасибо, Себу


person black    schedule 21.01.2014    source источник


Ответы (1)


Я не проверял, но из кода видно, что оба будут вызываться.

Я загрузил исходный код Android 4.3 (API 18) с помощью диспетчера SDK. Следующие наблюдения заставили меня подумать, что оба будут коллированы. Эти события вызываются классом: com.android.server.TelephonyRegistry.

Однако он уведомляет слушателя:

public void listen(String pkgForDebug, IPhoneStateListener callback, int events, boolean notifyNow)

Эта же функция вызывает оба типа уведомлений (Location и CellInfo) неисключительным образом.

В строке 256:

if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION)) {
    try {
             if (DBG_LOC) Slog.d(TAG, "listen: mCellLocation=" + mCellLocation);
             r.callback.onCellLocationChanged(new Bundle(mCellLocation));
        } catch (RemoteException ex) {
             remove(r.binder);
        }
    }

Этот будет вызывать onCellLocationChanged даже на новом телефоне LTE, поскольку в приведенном выше коде нет ничего, что могло бы предотвратить это. Это требует двойной проверки того, что нет верхнего уровня, который фильтрует сами события.

В строке 300 того же кода:

if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) {
     try {
         if (DBG_LOC) Slog.d(TAG, "listen: mCellInfo=" + mCellInfo);
          r.callback.onCellInfoChanged(mCellInfo);
     } catch (RemoteException ex) {
          remove(r.binder);
     }
}

Есть и другие вещи из кода, которые выглядят так, как будто CDMA будет вызывать более новый API. Например, com.android.internal.telephony.cdma.CdmaLteServiceStateTracker, похоже, имеет дело с CDMA и LTE. Опять же, это потребует более внимательного взгляда, но это должно дать вам хорошее место для начала. Вы также можете попробовать смоделировать это с помощью эмулятора.

person isaac.hazan    schedule 28.01.2014
comment
Спасибо, что покопался. Я проверил это на LG G2, и похоже, что onCellInfoChanged никогда не вызывается. Я собираюсь снова проверить, могу ли я получить доступ к информации о соте LTE через TelephonyManager.getAllCellInfo() в старых обратных вызовах. Кроме того, я читал в документации, что OEM-производителям не следует использовать объекты GSM/CDMA для представления информации о ячейке LTE (нет объекта LteCellLocation), так что это должно исключать onCellLocationChanged. Хотя не могу вспомнить, где я это видел. - person black; 01.02.2014
comment
На LG G2 (под управлением 4.2) данные LTE доступны через TelephonyManager.getAllCellInfo, но вызовы onCellInfoChanged не выполняются. Я могу получить доступ к этой информации, когда вызывается onSignalStrengthsChanged. - person black; 05.02.2014