我的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模式?我无法找到任何类似行为的文档。我怎么能在我的代码中处理这个?感谢。
答案 0 :(得分:6)
我无法解释为什么会这样。我有一些理论,但你有类似的理论。
在理清原因时,您可以务实地处理问题。您知道有时即使您在回调中获得了GSM SignalStrength
,有时在某些设备上您会从CellLocation
获得CDMA TelephonyManager
并使用{{编写代码来处理该情况1}}而不是依赖instanceOf
的{{1}}。
.isGSM()