Как программно ответить на звонок?
Я хочу ответить на телефонный звонок. Я нашел намерение 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