gpt4 book ai didi

Java ClassCastException : How Come?

转载 作者:行者123 更新时间:2023-11-30 05:31:55 27 4
gpt4 key购买 nike

我正在尝试使用 Android 电话管理器结束调用(新的调用筛选 API 不适合我)。我在网上找到了很多例子,都与我下面的代码非常相似。它编译得很好,但我在运行时遇到了 ClassCastException

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

异常(exception)是

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

我发现的示例也直接包含 Java 接口(interface),如下所示:

public static interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}

什么原因导致这种类型的异常?我该如何修复它?
(我对添加的接口(interface)非常怀疑)。

我还尝试导入com.android.internal.telephony(其中包括 ITelephony),但不符合要求。

最佳答案

它可以编译,因为您使用了反射:Object Method.invoke()
反射在编译时通常很好,但在运行时可能会较差。

在这里,您尝试转换的实例是在运行时Proxy,更准确地说是嵌套类:com.android.internal.telephony.ITelephony.Stub.Proxy

您定义为 MyApp.IncomingCallReceiver 的嵌套类的接口(interface) ITelephony 不是该 Proxy 类的实例。这是肯定的,因为它没有扩展任何内容:

public static interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}

而类强制转换异常。

我认为 Proxycom.android.internal.telephony.ITelephony 的生成实现,因此您需要做的可能只是导入该类并转换到此类:

import com.android.internal.telephony.ITelephony;
//..
telephonyService = (ITelephony) m.invoke(tm);

关于Java ClassCastException : How Come?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57349721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com