一些GSM设备因Android上的CDMA SignalStrength错误而崩溃

时间:2013-01-23 16:33:10

标签: android gsm telephony telephonymanager lte

我的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返回true时才触发此代码,则不确定为什么会出现isGSM的任何内容。也许当检测到LTE信号时,就Android API而言,这会使手机处于某种双CDMA / GSM模式?我无法找到任何类似行为的文档。我怎么能在我的代码中处理这个?感谢。

1 个答案:

答案 0 :(得分:6)

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

在理清原因时,您可以务实地处理问题。您知道有时即使您在回调中获得了GSM SignalStrength,有时在某些设备上您会从CellLocation获得CDMA TelephonyManager并使用{{编写代码来处理该情况1}}而不是依赖instanceOf的{​​{1}}。

.isGSM()