以编程方式回答Whatsapp视频通话

时间:2018-04-11 12:56:14

标签: android whatsapp

有没有办法在Android中使用AccessibilityService自动回答whatsapp视频通话?

或者有没有办法刺激点击耳机/蓝牙的呼叫应答按钮? 如何获取回答按钮的ID?使用辅助功能服务执行单击

我知道从Android 8.0 Oreo开始我们有ANSWER_PHONE_CALLS权限,但对于我的项目,我想使用旧设备进行远程监控。

任何帮助将不胜感激!

-----更新:感谢hemisphire先生和Kahbazi先生的回答,该应用程序能够接听电话,但需要成为一个系统应用才能工作!有没有办法让它成为一个没有系统应用程序的工作?没有耳机的按钮黑客?

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() {

    }
}

3 个答案:

答案 0 :(得分:11)

我认为你不能做你想做的事。使用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" );
                }
            }
        }
    }
}

但是,我从来没有能够以编程方式接听电话。 How can incoming calls be answered programmatically in Android 5.0 (Lollipop)?的问题可以很好地枚举所有可能的选项,但大多数都需要root和/或作为系统应用程序。

答案 1 :(得分:6)

您可以使用sendKeyDownUpSync课程中的Instrumentation方法。

Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_HEADSETHOOK);

如果此代码无效,请尝试使用其他KeyEvent找到正确的代码。

您可以在此链接中看到KeyEvent的列表:https://developer.android.com/reference/android/view/KeyEvent.html

您可以在此处查看更多信息:Instrumentation

答案 2 :(得分:6)

实现此目的的一种经典方法是使用NotificationListenerService观察通知并对相关的action of the notification采取行动。