Ответ на видео-вызов Whatsapp программно
Есть ли способ автоматического ответа на вызов whatsapp с помощью AccessibilityService в Android?
ИЛИ есть ли способ стимулировать щелчок на кнопке ответа на гарнитуру /bluetooth? Как я могу получить идентификатор кнопки ответа? выполнить клик с помощью службы доступности
Я знаю, что начиная с Android 8.0 Oreo у нас есть разрешение ANSWER_PHONE_CALLS, но для моего проекта я хочу использовать старое устройство для удаленного мониторинга.
Любая помощь будет оценена!
----- Обновление: благодаря ответу г-на гемисфира и г-на Кахбази, приложение может ответить на звонок, но должно быть системным приложением для работы! есть ли способ заставить его работать, не будучи системным приложением? без взлома кнопки гарнитуры?
public class AnswerCall extends AccessibilityService {
@Override
public void onAccessibilityEvent( AccessibilityEvent event )
{
if(event.getEventType() == TYPE_WINDOW_CONTENT_CHANGED)
{
if(event.getPackageName().equals("com.whatsapp"))
{
Thread thread = new Thread() {
@Override
public void run() {
try {
while(true) {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_HEADSETHOOK);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
StringBuilder sb = new StringBuilder();
List<CharSequence> texts = event.getText();
if (!texts.isEmpty())
{
for (CharSequence s : event.getText()) {
sb.append(s);
}
if(sb.toString().equals("Incoming video call"))
Log.d( "onAccessibilityEvent", "whatsapp video call" );
}
}
}
}
@Override
public void onInterrupt() {
}
}
Ответы
Ответ 1
Я не думаю, что ты можешь делать то, что хочешь. Используя AccessibilityService, вы можете узнать, когда приходит видеовызов:
@Override
public void onAccessibilityEvent( AccessibilityEvent event )
{
if(event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
{
if(event.getPackageName().equals("com.whatsapp"))
{
StringBuilder sb = new StringBuilder();
List<CharSequence> texts = event.getText();
if (!texts.isEmpty())
{
for (CharSequence s : event.getText())
{
sb.append(s);
}
if(sb.toString().equals("Incoming video call"))
{
Log.d( "onAccessibilityEvent", "whatsapp video call" );
}
}
}
}
}
Тем не менее, я никогда не мог ответить на вызов программным путем. Вопрос о том, как входящие звонки могут быть запрошены программным способом в Android 5.0 (Lollipop)? отлично справляется с перечислением всех возможных опций, но большинство из них требует root и/или является системным приложением.
Ответ 2
Вы можете использовать метод sendKeyDownUpSync
из класса Instrumentation
.
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_HEADSETHOOK);
если этот код не работает, попробуйте использовать другой KeyEvent
чтобы найти правильный.
Вы можете увидеть список KeyEvent
по этой ссылке: https://developer.android.com/reference/android/view/KeyEvent.html
Вы можете узнать больше информации здесь: Instrumentation
Ответ 3
Классический способ достижения этого - наблюдать уведомления с помощью службы NotificationListenerService и действовать в соответствии с соответствующим действием уведомления.