4

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

主要活动:

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

细胞监听器:

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

4

3 回答 3

5

您只被调用一次并使用 null 作为参数的真正原因如下:默认情况下似乎有一个速率限制设置,可以在“测试”应用程序中观察到,该应用程序可以通过以下方式访问拨号*#*#INFO#*#*(即*#*#4636#*#*)。

在测试应用程序中,选择“电话信息”并向下滚动到按钮CELLINFOLISTRATE xxxx,在您的情况下大概是CELLINFOLISTRATE 2147483647。因为2147483647 == MAX_INT,这可能意味着根本没有调用

对我来说(股票 android 6.0,nexus 6),可以在MAX_INT(一个调用为 null)01000.

我不是 100% 确定这些值的含义,但大概 0 代表即时(因此非常多)呼叫,而 1000 代表呼叫之间至少一秒钟。但请记住,这纯粹是猜测。

当我发现更多信息时,我将编辑这个答案,例如通过查看所述测试应用程序的实现。

于 2016-04-19T22:07:05.383 回答
2

@bofredo:它返回 null 因为您尚未定义CellInfo

如果您使用的是 CDMA、GSM 或 LTE,则无法从您的问题中看出。从记忆中,CDMA 似乎没有返回任何东西,但 GSM ( CellInfoGsm ) 和 LTE ( CellInfoLte ) 会。所以做一些类似的事情:

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

将返回CellInfoGsmor的一个实例,CellInfoLte然后允许您检索有关单元格的更多信息,例如:

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

或者

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

然后使用cellIdentityGsm,cellIdentityLtecellSignalStrengthGsmcellSignalStrengthLte你想做的事onCellInfoChanged

于 2013-11-18T16:39:14.890 回答
0

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

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

注意:下图将帮助您使用最新的 Android 操作系统。只需更新mobile info refresh rate手机信息 1/2 选项(我希望多个手机信息,因为多个 sim 卡)

隐藏菜单 在此处输入图像描述

于 2019-03-11T09:38:58.753 回答