收听传入的Whatsapp消息/通知

时间:2013-01-26 18:55:50

标签: android android-intent android-notifications android-notification-bar android-broadcast

我正在开发基于通知的应用,我需要收听来电通知。我已经能够收听来电,短信,邮件等。我不知道如何通过代码在Whatsapp上听朋友的ping或消息。这可以实际完成吗?如果是这样,怎么样?可以Accessibility Service使用包名称作为“com.whatsapp”吗?

6 个答案:

答案 0 :(得分:19)

我可以使用Accessibility Service执行此操作。使用此功能,您可以收听通知栏上的所有通知。我通过将包名称添加到辅助功能服务service info来监听应用程序规范,在本例中为com.whatsapp。我无法阅读这些消息,但每当有消息到达时我都会收到通知。

答案 1 :(得分:9)

您可以实际解析传入的通知和自Android 4.2以来的消息。我做到了这一点:https://github.com/Snirpo/whatsapprelay。这是通过accessibilityservice完成的。目前它解析来自某个WhatsApp组的消息。但它可以适用于解析所有消息。不幸的是,通过WhatsApp发送消息更加困难。

答案 2 :(得分:5)

除非该应用的开发者故意共享服务,内容提供商,或故意发送事件的公开广播,或公开自定义广播注册系统,否则在Android中没有合法的方式来听取第三方的内部工作应用。应用程序隔离是在Android中设计的一个非常重要的原因:安全性

答案 3 :(得分:3)

辅助功能事件仅捕获传入通知事件,而不是更新它们。目前,WhatsApp通知不会显示消息,只显示发件人。然后,WhatsApp应用程序会添加一条消息,其中包含无法通过辅助功能服务捕获的更新。

您只会收到“来自XXX的1条新消息”,但这可能足以满足您的需求。

答案 4 :(得分:2)

请参阅以下示例以捕获whatsapp通知:

public class Notifier extends AccessibilityService {


@Override
public void onCreate(){
    //Toast.makeText(this,"Oncreate", Toast.LENGTH_LONG).show();

}

@Override
protected void onServiceConnected() {
    // Set the type of events that this service wants to listen to.  Others
    // won't be passed to this service.
    Toast.makeText(this,"Service connected", Toast.LENGTH_LONG).show();
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;;
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED ;

    // If you only want this service to work with specific applications, set their
    // package names here.  Otherwise, when the service is activated, it will listen
    // to events from all applications.
    info.packageNames = new String[] {"com.whatsapp"};
    info.notificationTimeout = 100;

    setServiceInfo(info);

}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    if(event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {

            Toast.makeText(this,"Notification Catched", Toast.LENGTH_LONG).show();
        }

    }
}

并且不要忘记从设置>辅助功能设置权限以访问系统事件。允许设置权限。

检查此链接

accessibility service is not started

答案 5 :(得分:0)

在这篇分为两部分的文章的帮助下,我听了传入的WhatsApp消息通知,您可以从here中阅读它。

  1. 配置AndroidManifest.xml
<!-- AndroidManifest.xml -->
<service
    android:name=".MyAccessibilityService"
    android:enabled="true"
    android:exported="true"
    android:label="My application"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>

    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/serviceconfig" />
</service>
  1. / xml / 目录中创建一个名为serviceconfig.xml的新文件。
<!-- serviceconfig.xml -->
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:canRequestEnhancedWebAccessibility="true"
    android:notificationTimeout="100"
    android:packageNames="@null"
    android:canRetrieveWindowContent="true"
    android:canRequestTouchExplorationMode="true"  />
  1. 创建一个扩展MyAccessibilityService的新AccessibilityService类。
@Override
protected void onServiceConnected() {
        System.out.println("onServiceConnected");
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
        info.notificationTimeout = 100;
        info.packageNames = null;
        setServiceInfo(info);
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
        if (event.getPackageName().toString().equals("com.whatsapp")){
            StringBuilder message = new StringBuilder();
            if (!event.getText().isEmpty()) {
                for (CharSequence subText : event.getText()) {
                    message.append(subText);
                }

                // Message from +12345678

            }
        }
    }
}
  1. 准备好了。现在,您可以根据需要自定义服务。
  

注意:由于可访问性服务能够浏览屏幕内容并与之交互,因此用户必须在“设置”>“可访问性”中显式启用服务。 More details

编辑

发送对收到的通知check out this答案的答复。