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

mik*_*e47 1 android telephony gsm 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();    //********
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

iag*_*een 6

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

在理清原因的同时,您可以务实地处理问题.你知道,有时候即使你得到一个GSM SignalStrength上的一些设备在你的回调,有时你会得到一个CDMA CellLocationTelephonyManager和编写代码来处理使用的情况下instanceOf依靠,而不是.isGSM()SignalStrength.

CellLocation cellLoc = tm.getCellLocation();
if(cellLoc instanceof GsmCellLocation) {
   GCellLoc = (GsmCellLocation) cellLoc;
   // do work 
}
Run Code Online (Sandbox Code Playgroud)