0

我正在尝试在来电中发送 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 类的源代码链接:呼叫管理器源代码 但我总是在方法 sendDtmf() 中得到“假”。在调试中,代码进入下一步:

 Object res = methodGetState.invoke(objectCallManager, 
                            new Object[]{Character.valueOf(ch)});

怎么了?

4

1 回答 1

1

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

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

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

于 2015-05-16T16:58:05.227 回答