Как программно ответить на звонок в Android 4.0.3?

Итак, как говорится в теме, мне нужно иметь возможность программно отвечать на телефонный звонок в Android 4.0.3 на HTC OneX. Я читал в нескольких местах, что разрешение MODIFY_PHONE_STATE было отозвано Google, поэтому для выполнения этой задачи вам нужен обходной путь.

До сих пор я рассматривал два пути:

(1) После сообщения Гая здесь и используя BroadcastReceiver

(2) Используйте следующий код, чтобы попытаться нажать ключевое событие с помощью команды оболочки.

final Runtime r = Runtime.getRuntime();
    try {
        Process process = r.exec("input keyevent 5");
        InputStream stream = process.getErrorStream();
        log.v("Process Error Stream: " +stream.toString());
        log.v("Sending shell command to Answer Call");
    } catch (Exception e) {
        log.v("Stack Trace: " + e.getStackTrace().toString());
        e.printStackTrace();
    } 

Я использую это, потому что keyevent 5 - это KeyEvent.CALL в соответствии с Google, и он работает в adb, используя

adb shell input keyevent 5

У меня вопрос, что я делаю не так? Потому что логически оба эти метода имеют смысл, но ни один из них не работает и даже не генерирует какие-либо ошибки времени выполнения.

Ваше здоровье


person onetwopunch    schedule 09.10.2012    source источник


Ответы (3)


После нескольких дней исследований я обнаружил, что с использованием маршрута широковещательного приемника и маршрута runtime.exec() просто невозможно ответить на телефонный звонок в Android 4.0.3 с помощью Android API.

Для тех из вас, кто все еще задается вопросом, я нашел кое-какую полезную информацию... Вы МОЖЕТЕ ответить на звонок через adb, используя команду adb shell input keyevent 5 5 — это код кнопки вызова, а в Android это KEYEVENT_CALL

person onetwopunch    schedule 10.11.2012
comment
Я полагаю, что что-то подобное было бы кошмаром для безопасности/UX, если бы они позволяли отвечать на вызовы, делать их или иным образом программно вмешиваться. - person Phix; 10.11.2012
comment
Как именно мы реализуем этот код? Просто заменить input keyevent 5 на adb shell input keyevent 5? - person Naddy; 15.09.2013

Это работает с Android 2.2 до 4.0, и теперь, после добавления try catch в последнюю строку, это работает для 4.1.2 и 4.2. Честно говоря, не знаю, как это работает, но это работает для меня.

          Log.d(tag, "InSecond Method Ans Call");
    // froyo and beyond trigger on buttonUp instead of buttonDown
    Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
    buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
    sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
    Intent headSetUnPluggedintent = new Intent(Intent.ACTION_HEADSET_PLUG);
    headSetUnPluggedintent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    headSetUnPluggedintent.putExtra("state", 0);
    headSetUnPluggedintent.putExtra("name", "Headset");
    try {
        sendOrderedBroadcast(headSetUnPluggedintent, null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Это работает для меня в Android 4.1.2, а также я тестировал на 4.2. Это все еще дает исключение, которое обрабатывается.

person PravinDodia    schedule 25.04.2013

Вот несколько полезных ссылок, посмотрите их:

  1. Автоматически отвечать на входящие звонки
  2. Как автоматически отвечать на звонки программно
  3. Автоответ
person Viktor Apoyan    schedule 09.10.2012
comment
Возможно, я не совсем понял, но Google ИЗМЕНИЛ возможность использования диспетчера телефонии в более новых версиях Android, и все ссылки, которыми вы поделились, либо нерешены, либо не имеют отношения к моему вопросу. Мне нужен совет по методам, которые я использую, или помощь с другим способом решения этой проблемы, а не с тем же поиском в Google, который я выполнял несколько раз перед публикацией на SO. - person onetwopunch; 09.10.2012
comment
здесь я нашел статью, проверьте эту grokbase.com/t/gg/android-developers/12547a1nda/ - person Viktor Apoyan; 10.10.2012