Вопрос

я пытаюсь получить список всех доступных ячеек, которые может найти устройство.Но я застрял, так как мой CellInfo всегда равен null, и я не понимаю, почему.Кто-нибудь может дать мне подсказку?В 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);     
    }
}

Логкат:

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) запускаются один раз, и последнее корректно возвращает текущую ячейку, используемую устройством.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

@bofredo: It is returning null because you haven't defined CellInfo yet.

Can't see from your question if you're using CDMA, GSM, or LTE. From memory, CDMA doesn't seem to return anything, but GSM (CellInfoGsm) and LTE (CellInfoLte) do. So doing something like for example:

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

will return an instance of CellInfoGsm or CellInfoLte which will then allow you to retrieve more information about a cell like:

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

or

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

Then use cellIdentityGsm, cellIdentityLte, cellSignalStrengthGsm and cellSignalStrengthLte to do what you want in onCellInfoChanged.

In addition to @bimmlerd answer. If you are updating the Phone Information via dialing *#*#INFO#*#* (i.e. *#*#4636#*#*). There are chances that the hidden menu doesn't appear. In that case, use default dialer if you are using some 3rd party call management application (Worked for me as it was not showing any hidden menu for phone information).

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

Note: The following picture will help you with the latest Android OS. Just update the mobile info refresh rate in phone information 1/2 option (I hope multiple phone information because of multiple sim cards)

Hidden Menu enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top