我正在嘗試使用 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);
添加回答
舉報
0/150
提交
取消