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

Я хочу ответить на телефонный звонок. Я нашел намерение android.intent.action.ANSWER но кажется, что единственный эффект, который я получаю, - это ActivityNotFoundException. Зачем? Это осуждаемое намерение? Как я могу добиться ответа? Я также слышал о "технике Telnet". Что это такое?

Спасибо

8 ответов

Решение

Это невозможно, проверьте эту тему для получения дополнительной информации.

Вы также можете отправить вызов вызова для ответа на вызовы, но устройство должно быть рутировано

отвечать на звонки:

try {
    Thread.sleep(800); 
    Process process = Runtime.getRuntime().exec(new String[]{ "su","-c","input keyevent 5"});
    process.waitFor();

}catch (Exception e) {
    e.printStackTrace();
}

Конечные звонки:

try {
    Thread.sleep(800); 
    Process process = Runtime.getRuntime().exec(new String[]{ "su","-c","input keyevent 6"});
    process.waitFor();

}catch (Exception e) {
    e.printStackTrace();
}

Можно ответить на входящий телефонный звонок. Проверьте это: здесь

Это работает с 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 Это все еще дает исключение, которое обрабатывается.

Это событие доза не работает. вы должны использовать:

Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HEADSETHOOK);
i.putExtra(Intent.EXTRA_KEY_EVENT, event );
context.sendOrderedBroadcast(i, null);

которые подражают поведению нажатой клавиши.

Подход, используемый при моделировании телефона BT, не работает со всеми версиями Android и со всеми устройствами, так как обработка телефона BT может отличаться.

Лучший подход, проверенный во многих устройствах и версиях Android, состоит в эмуляции нажатия и отпускания кнопки вызова в программе набора номера:

Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_CALL));
context.sendOrderedBroadcast(buttonDown, "android.permission.CALL_PRIVILEGED");

// 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_CALL));
context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED"); 

Вы можете сделать это также, отправив команду Shell "input keyevent 5" через adb или через Runtime.exec, но в моем случае это не работает для всех устройств

try {
Runtime.getRuntime().exec("input keyevent"+Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));
} catch (IOException e) {
   //handle error here
}

Намерение ответить должно быть отправлено на InCallScreen.

adb shell am start -n com.android.phone/.InCallScreen -a android.intent.action.ANSWER
Другие вопросы по тегам