Android отправляет dtmf на входящий звонок

Я пытаюсь отправить DTMF коды в icoming CALL. Для этого я попытаюсь использовать отражение 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)});

Что не так?

1 ответ

Этот метод, скорее всего, вызывает исключение InvocationTargetException, если ваше приложение не подписано сертификатом платформы, так как обычные приложения не могут выполнять эти методы (и для этого не будут предоставлены необходимые разрешения платформы).

Вкратце: метод возвращает false, потому что вы перехватываете (и игнорируете) исключение.

Есть открытая проблема ( # 1428) на трекере проблем Android для отправки тонов DTMF, поскольку в настоящее время это невозможно.

Другие вопросы по тегам