1

私のAndroidアプリは、セルラー信号強度を監視します。CDMAデバイスでは、問題なく動作します。多くのGSMデバイスでは、問題なく動作します。ただし、一部のGSMデバイスでは、次のエラーメッセージが表示されて強制終了します。

java.lang.ClassCastException:android.telephony.cdma.CdmaCellLocationをandroid.telephony.gsm.GsmCellLocationにキャストできません

この問題は、米国の一部のSamsungデバイスで4GLTE信号を受信したときに発生すると確信しています。他のデバイスや国でも発生すると思います。私はまだ関係する正確なサービスプロバイダーとデバイスを特定しようとしています。

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();    //********
    ...
}

このコードがtrueを返しandroid.telephony.cdmaたときにのみトリガーされる必要がある場合、fromが表示される理由がわかりません。isGSMおそらく、LTE信号が検出されると、Android APIに関する限り、電話はある種のデュアルCDMA / GSMモードになりますか?同様の動作のドキュメントを見つけることができませんでした。コードでこれをどのように処理できますか?ありがとう。

4

1 に答える 1

6

なぜそれが起こっているのか説明できません。私にはいくつかの理論がありますが、あなたにも似たような理論があります。

理由を整理しながら、実践的に問題に対処することができます。コールバックでGSMを取得している場合でも、SignalStrength一部のデバイスではCDMAを取得し、CellLocationからに依存する代わりにをTelephonyManager使用してそのケースを処理するコードを記述している場合があります。instanceOf.isGSM()SignalStrength

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