我正在尝试获取设备可以找到的所有可用单元的列表。但我被卡住了,因为我的CellInfo总是为空而且我不知道为什么。有人能给我一个暗示吗? google上的onCellInfoChanged()信息很少。
我的名字是c:
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)都被触发,后者正确地返回设备正在使用的当前单元格。
您只被调用一次并且使用null作为参数的真正原因如下:默认情况下似乎存在限速设置,可以在“测试”应用程序中观察到,可以通过拨打*#*#INFO#*#*
(即*#*#4636#*#*
)。
在测试应用程序中,选择“电话信息”并向下滚动到按钮CELLINFOLISTRATE xxxx
,在您的情况下可能是CELLINFOLISTRATE 2147483647
。作为2147483647 == MAX_INT
,这可能意味着没有任何电话
对于我(股票android 6.0,nexus 6),有一个选择MAX_INT
(一个调用null),0
和1000
。
我不是百分之百地确定这些值是什么意思,但是假设0代表即时(因此很多)调用,而1000代表至少一秒钟之间的调用。请记住,这是纯粹的猜测。
我将在我发现更多内容时编辑此答案,例如通过查看所述测试应用程序的实现。
@bofredo:它返回null,因为你还没有定义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操作系统。只需更新手机信息1/2选项中的mobile info refresh rate
(我希望多个手机信息,因为多个SIM卡)