onCellInfoChanged()回调始终为null

时间:2013-11-18 13:53:18

标签: android cell cellinfo

我正在尝试获取设备可以找到的所有可用单元的列表。但我被卡住了,因为我的CellInfo总是为空而且我不知道为什么。有人能给我一个暗示吗? google上的onCellInfoChanged()信息非常少。

MainActivity:

 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&amp; onCellLocationChanged)被触发一次,后者正确地返回设备正在使用的当前单元格。

3 个答案:

答案 0 :(得分:5)

您只被调用一次并且使用null作为参数的真正原因如下:默认情况下似乎存在限速设置,可以在&#34;测试&#34中观察到;应用,可以通过拨打*#*#INFO#*#*(即*#*#4636#*#*)来访问。

在测试应用中,选择&#34;电话信息&#34;然后向下滚动到按钮CELLINFOLISTRATE xxxx,大概是CELLINFOLISTRATE 2147483647。作为2147483647 == MAX_INT,这可能意味着根本没有呼叫

对于我(股票android 6.0,nexus 6),可以选择MAX_INT(一次调用null),01000

我不能100%确定这些值是什么意思,但可能0表示即时(因此很多)调用,而1000表示至少一秒钟之间的调用。但请记住,这是纯粹的推测。

我会在我发现更多内容时编辑此答案,例如通过查看所述测试应用程序的实现。

答案 1 :(得分:2)

@bofredo:它返回null,因为你还没有定义CellInfo

如果您使用的是CDMA,GSM或LTE,则无法从您的问题中看到。从内存来看,CDMA似乎没有任何回报,但GSM(CellInfoGsm)和LTE(CellInfoLte)确实如此。所以做一些例如:

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

将返回CellInfoGsmCellInfoLte的实例,然后您可以检索有关单元格的更多信息,如:

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

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

然后使用cellIdentityGsmcellIdentityLtecellSignalStrengthGsmcellSignalStrengthLteonCellInfoChanged中执行您想要的操作。

答案 2 :(得分:0)

除了@bimmlerd答案。如果要通过拨打Phone Information(即*#*#INFO#*#*)来更新*#*#4636#*#*。隐藏的菜单有可能不会出现。在这种情况下,如果您正在使用某些第三方呼叫管理应用程序(对我有​​用,因为它没有显示任何隐藏的电话信息菜单),请使用默认拨号程序。

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

注意: 下图将帮助您使用最新的Android OS。只需更新电话信息1/2选项中的mobile info refresh rate(我希望由于有多个SIM卡而获得多个电话信息)

Hidden Menu enter image description here