Функция обратного вызова onCellInfoChanged() всегда равна нулю

Я пытаюсь получить список всех доступных ячеек, которые устройство может найти. Но я застрял, так как мой CellInfo всегда нулевой, и я не понимаю, почему. Может кто-нибудь дать мне подсказку? В Google очень мало информации о onCellInfoChanged().

Основная деятельность:

 CellListener cellListener = new CellListener(this);
 cellListener.start();

CellListener:

public class CellListener extends PhoneStateListener {

private static final String TAG = "CellListener";
private TelephonyManager telephonyManager = null;
private PhoneStateListener listener = null;
private String newCell = null;  
private int events = PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_CELL_INFO;
private Context context = null;

public CellListener(Context context) {
    this.context = context;
}

public void start() {

    telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    CellLocation.requestLocationUpdate();

    telephonyManager.listen(this, events);
}

@Override
public void onCellInfoChanged(List<CellInfo> cellInfo) {
    Log.i("CellListener","onCellInfoChanged(List<CellInfo> cellInfo) ");
    super.onCellInfoChanged(cellInfo);

     if(cellInfo == null) return;     // this always null here

     for (CellInfo c : cellInfo) {          
        Log.i("CellListener"," c = "+c);
    }       
 }

 @Override
    public void onCellLocationChanged(CellLocation location) {
        if (!(location instanceof GsmCellLocation)) {
            return;
        }
        GsmCellLocation gsmCell = (GsmCellLocation) location;
        String operator = telephonyManager.getNetworkOperator();
        if (operator == null || operator.length() < 4) {
            return;
        }
        newCell = operator.substring(0, 3) + ':' + operator.substring(3) + ':'
                + gsmCell.getLac() + ':' + gsmCell.getCid();

        Log.i(TAG,"newCell = "+newCell);     
    }
}

Logcat:

11-18 14:50:23.806: I/CellListener(4953): newCell = 262:02:4311:99031735
11-18 14:50:23.814: I/CellListener(4953): onCellInfoChanged(List<CellInfo> cellInfo) 

Как вы можете видеть, оба события (onCellInfoChanged и onCellLocationChanged) запускаются один раз, и последний корректно возвращает текущую ячейку, которую использует устройство.

2 ответа

Решение

Истинная причина, по которой вам звонят только один раз, а в качестве аргумента используется значение null, заключается в следующем: по умолчанию, по-видимому, существует параметр ограничения скорости, как это можно наблюдать в приложении "testing", доступ к которому можно получить: набор номера *#*#INFO#*#* (т.е. *#*#4636#*#*).

В тестовом приложении выберите "Информация о телефоне" и прокрутите вниз до кнопки CELLINFOLISTRATE xxxxв вашем случае предположительно CELLINFOLISTRATE 2147483647, Как 2147483647 == MAX_INT, это, вероятно, означает, что никаких звонков вообще

Для меня (стоковый Android 6.0, Nexus 6), есть выбор между MAX_INT (один звонок с нулем), 0 а также 1000,

Я не уверен на 100%, что означают эти значения, но предположительно, 0 означает мгновенные (и, следовательно, очень многие) вызовы, а 1000 - что-то вроде, по крайней мере, секунды между вызовами. Имейте в виду, хотя, это чистое предположение.

Я отредактирую этот ответ, когда узнаю больше, например, посмотрев реализацию указанного тестирующего приложения.

@bofredo: он возвращает ноль, потому что вы не определили CellInfo еще.

По вашему вопросу не вижу, используете ли вы CDMA, GSM или LTE. Из памяти CDMA, похоже, ничего не возвращает, но GSM ( CellInfoGsm) и LTE ( CellInfoLte) делают. Делая что-то вроде например:

CellInfoGsm cellInfoGsm = (CellInfoGsm) cellInfo;
CellInfoLte cellInfoLte = (CellInfoLte) cellInfo;

вернет экземпляр CellInfoGsm или же CellInfoLte что позволит вам получить больше информации о такой ячейке, как:

CellIdentityGsm cellIdentityGsm = cellInfoGsm.getCellIdentity();
CellIdentityLte cellIdentityLte = cellInfoLte.getCellIdentity();  

или же

CellSignalStrengthGsm cellSignalStrengthGsm = cellInfoGsm.getCellSignalStrength();
CellSignalStrengthLte cellSignalStrengthLte = cellInfoLte.getCellSignalStrength();

Тогда используйте cellIdentityGsm, cellIdentityLte, cellSignalStrengthGsm а также cellSignalStrengthLte делать то, что вы хотите в onCellInfoChanged,

В дополнение к ответу @bimmlerd. Если вы обновляете Phone Information через набор *#*#INFO#*#* (т.е. *#*#4636#*#*). Есть вероятность, что скрытое меню не появится. В этом случае используйте номеронабиратель по умолчанию, если вы используете какое-либо стороннее приложение для управления вызовами (сработало для меня, так как оно не показывало скрытого меню для информации о телефоне).

https://www.reddit.com/r/GooglePixel/comments/6xc40q/4636_service_menu_not_available_in_oreo/

Примечание: следующая картина поможет вам с последней ОС Android. Просто обновите mobile info refresh rate в опции информации о телефоне 1/2 (я надеюсь, что информация о нескольких телефонах из-за нескольких сим-карт)

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