我尝试在icoming CALL中发送DTMF代码。为此,我尝试使用Java反射:
public void initialize(){
ClassLoader classLoader = Dtmf.class.getClassLoader();
final Class<?> classCallManager = classLoader.loadClass("com.android.internal.telephony.CallManager");
Method methodGetInstance = classCallManager.getDeclaredMethod("getInstance");
objectCallManager = methodGetInstance.invoke(null);
methodGetState = classCallManager.getDeclaredMethod(SEND_DTMF, char.class);
}
public boolean sendDtmf(char ch) {
boolean result = false;
if ( methodGetState != null) {
try {
Object res = methodGetState.invoke(objectCallManager,
new Object[]{Character.valueOf(ch)});
if (res instanceof Boolean) {
result = ((Boolean) res).booleanValue();
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
return result;
}
CallManager类源代码的链接:Call Manager source code 但是我总是在方法sendDtmf()中得到“假”。在调试中,代码将进入下一步:
Object res = methodGetState.invoke(objectCallManager,
new Object[]{Character.valueOf(ch)});
有什么不对?
答案 0 :(得分:1)
如果您的应用程序未使用平台证书签名,则该方法可能会抛出InvocationTargetException,因为传统应用程序无法执行这些方法(并且不会授予此类方法所需的平台权限)。
简而言之:该方法返回false,因为您正在捕获(并忽略)异常。
在Android问题跟踪器上有一个未解决的问题(#1428),用于发送DTMF音,因为它目前是不可能的。