1

我的 Android 应用程序监控蜂窝信号强度。在 CDMA 设备上,它可以正常工作。在许多GSM 设备上,它可以正常工作。但是,在某些GSM 设备上,我会强制关闭并显示以下错误消息:

java.lang.ClassCastException: android.telephony.cdma.CdmaCellLocation 不能转换为 android.telephony.gsm.GsmCellLocation

我相当肯定美国的某些三星设备在接收到 4G LTE 信号时会出现此问题;我相信它也会发生在其他设备和国家。我仍在尝试确定所涉及的确切服务提供商和设备。

这是来自 MyService.java 的相关代码片段;我已将错误消息引用的行标记为//********

public void onCreate() {
    tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    ...
}

public int onStartCommand(Intent in, int flags, int startId) {
    signalStrengthListener = new SignalStrengthListener();
    ((TelephonyManager)getSystemService(TELEPHONY_SERVICE)).listen(signalStrengthListener, SignalStrengthListener.LISTEN_SIGNAL_STRENGTHS | SignalStrengthListener.LISTEN_SERVICE_STATE | SignalStrengthListener.LISTEN_DATA_CONNECTION_STATE | SignalStrengthListener.LISTEN_CELL_LOCATION);
    return START_STICKY;
    ...
}

public void onSignalStrengthsChanged(SignalStrength signalStrength) {
    isGSM = signalStrength.isGsm();
    if (isGSM == true) {
        GCellLoc = (GsmCellLocation)tm.getCellLocation();    //********
    ...
}

android.telephony.cdma如果仅在isGSM返回 true时触发此代码,则不确定为什么会出现任何内容。也许当检测到 LTE 信号时,就 Android API 而言,这会使手机处于某种双 CDMA/GSM 模式?我无法找到任何类似行为的文档。如何在我的代码中处理这个问题?谢谢。

4

1 回答 1

6

我无法解释为什么会这样。我有一些理论,但你也有类似的。

当你理清原因时,你可以务实地处理问题。您知道,有时即使您SignalStrength在回调中获得 GSM,有时在某些设备上您会从 CDMACellLocation获得TelephonyManager并编写代码来处理这种情况,使用instanceOf而不是依赖.isGSM()SignalStrength.

CellLocation cellLoc = tm.getCellLocation();
if(cellLoc instanceof GsmCellLocation) {
   GCellLoc = (GsmCellLocation) cellLoc;
   // do work 
}
于 2013-01-23T16:57:52.583 回答