Android将dtmf发送到来电

时间:2015-05-16 16:22:17

标签: android dtmf incoming-call

我尝试在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)});

有什么不对?

1 个答案:

答案 0 :(得分:1)

如果您的应用程序未使用平台证书签名,则该方法可能会抛出InvocationTargetException,因为传统应用程序无法执行这些方法(并且不会授予此类方法所需的平台权限)。

简而言之:该方法返回false,因为您正在捕获(并忽略)异常。

在Android问题跟踪器上有一个未解决的问题(#1428),用于发送DTMF音,因为它目前是不可能的。