Pergunta

estou tentando obter uma lista de todas as células disponíveis que o dispositivo pode encontrar.Mas estou preso, pois meu CellInfo é sempre nulo e não entendo por quê.Alguém pode me dar uma dica?Há muito poucas informações sobre onCellInfoChanged() no Google.

Atividade principal:

 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) 

Como você pode ver, ambos os eventos (onCellInfoChanged e onCellLocationChanged) são acionados uma vez e o último retorna corretamente a célula atual que o dispositivo está usando.

Foi útil?

Solução

A verdadeira razão pela qual você está sendo chamado exatamente uma vez e com null como argumento é o seguinte:parece haver uma configuração de limitação de taxa por padrão, como pode ser observado no aplicativo "testes", que pode ser acessado discando *#*#INFO#*#* (ou seja, *#*#4636#*#*).

No aplicativo de teste, escolha "Informações do telefone" e role para baixo até o botão CELLINFOLISTRATE xxxx, no seu caso, presumivelmente CELLINFOLISTRATE 2147483647.Como 2147483647 == MAX_INT, isso provavelmente significa que não haverá nenhuma chamada

Para mim (Android 6.0 padrão, Nexus 6), existe uma escolha entre MAX_INT (uma chamada com nulo), 0 e 1000.

Não tenho 100% de certeza do que esses valores significam, mas presumivelmente 0 significa chamadas instantâneas (e, portanto, muitas) e 1000 significa algo como pelo menos um segundo entre chamadas.Tenha em mente, porém, que isso é pura especulação.

Editarei esta resposta à medida que descobrir mais, por exemplo, observando a implementação do referido aplicativo de teste.

Outras dicas

@bofredo:Está retornando nulo porque você não definiu CellInfo ainda.

Não consigo ver na sua pergunta se você está usando CDMA, GSM ou LTE.Da memória, o CDMA parece não retornar nada, mas o GSM (CellInfoGsm) e LTE (CellInfoLte) fazer.Então, fazendo algo como, por exemplo:

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

retornará uma instância de CellInfoGsm ou CellInfoLte o que permitirá que você recupere mais informações sobre uma célula como:

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

ou

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

Então use cellIdentityGsm, cellIdentityLte, cellSignalStrengthGsm e cellSignalStrengthLte para fazer o que quiser em onCellInfoChanged.

Além da resposta @bimmlerd.Se você estiver atualizando o Phone Information via discagem *#*#INFO#*#* (ou seja, *#*#4636#*#*).Há chances de o menu oculto não aparecer.Nesse caso, use o discador padrão se estiver usando algum aplicativo de gerenciamento de chamadas de terceiros (funcionou para mim, pois não mostrava nenhum menu oculto para informações do telefone).

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

Observação:A imagem a seguir irá ajudá-lo com o sistema operacional Android mais recente.Basta atualizar o mobile info refresh rate na opção 1/2 de informações do telefone (espero que haja várias informações do telefone por causa de vários cartões SIM)

Hidden Menu enter image description here

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top