亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java ClassCastException:怎么會這樣?

Java ClassCastException:怎么會這樣?

浮云間 2023-05-17 15:08:27
我正在嘗試使用 Android Telephony Manager 結束通話(新的 Call Screening API 不適合我)。我在網上找到了很多例子,都和我下面的代碼非常相似。它編譯得很好,但我在線上得到了一個運行時 ClassCastExceptiontelephonyService = (ITelephony) m.invoke(tm); 例外是java.lang.ClassCastException:  com.android.internal.telephony.ITelephony$Stub$Proxy  cannot be cast to com.ramrod.MyApp.IncomingCallReceiver$ITelephony我的代碼是public class IncomingCallReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        ITelephony telephonyService;        try {            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);            String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);            if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){                TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);                try {                    Method m = tm.getClass().getDeclaredMethod("getITelephony");                    m.setAccessible(true);                    telephonyService = (ITelephony) m.invoke(tm);                    if ((number != null)) {                        telephonyService.endCall();                    }                } catch (Exception e) {                    e.printStackTrace();                }                Toast.makeText(context, "Ring " + number, Toast.LENGTH_SHORT).show();            }            if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){                Toast.makeText(context, "Answered " + number, Toast.LENGTH_SHORT).show();            }            if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){                Toast.makeText(context, "Idle "+ number, Toast.LENGTH_SHORT).show();            }        } catch (Exception e) {            e.printStackTrace();        }    }我也試過導入com.android.internal.telephony(包括 ITelephony),但這不符合要求。
查看完整描述

1 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

它編譯是因為你使用了反射:Object Method.invoke()。

反射在編譯時通常很好,但在運行時可能不太好。


在這里,您嘗試轉換的實例是在運行時Proxy,更準確地說是嵌套類:com.android.internal.telephony.ITelephony.Stub.Proxy。


ITelephony您定義為嵌套類的接口MyApp.IncomingCallReceiver不是該類的實例Proxy。這是肯定的,因為它沒有擴展:


public static interface ITelephony {

    boolean endCall();

    void answerRingingCall();

    void silenceRinger();

}

而類轉換異常。


我想這Proxy是生成的實現com.android.internal.telephony.ITelephony,所以您需要做的可能只是導入該類并轉換為此類:


import com.android.internal.telephony.ITelephony;

//..    

telephonyService = (ITelephony) m.invoke(tm); 


查看完整回答
反對 回復 2023-05-17
  • 1 回答
  • 0 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號