收听传入的Whatsapp消息/通知

san*_* mk 29 android android-intent android-notifications android-notification-bar android-broadcast

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

san*_* mk 18

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

  • @frankish:绝对.......不,你不能通过你的应用程序显示不同用户的自定义通知,但静音Whatsapp是不可能的除非你已经做了WhatsApp (2认同)
  • 链接失效了! (2认同)

小智 9

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

  • 是否有可用的回购副本? (9认同)
  • 你可以在其他地方发布代码似乎github repo被删除 (7认同)
  • 答案中提到的存储库不再可访问! (3认同)

Mis*_*rov 9

2020 年 8 月 11 日更新

我必须使用NotificationListenerService来获取有关通知的详细信息。

这是Java中的服务代码:

public class NotificationListener extends NotificationListenerService {

    private static final String TAG = "NotificationListener";
    private static final String WA_PACKAGE = "com.whatsapp";

    @Override
    public void onListenerConnected() {
        Log.i(TAG, "Notification Listener connected");
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        if (!sbn.getPackageName().equals(WA_PACKAGE)) return;

        Notification notification = sbn.getNotification();
        Bundle bundle = notification.extras;

        String from = bundle.getString(NotificationCompat.EXTRA_TITLE);
        String message = bundle.getString(NotificationCompat.EXTRA_TEXT);

        Log.i(TAG, "From: " + from);
        Log.i(TAG, "Message: " + message);
    }
}
Run Code Online (Sandbox Code Playgroud)

以及需要放在AndroidManifest.xml中的代码:

<service
    android:name=".NotificationListener"
    android:label="@string/notification_listener_service"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)

要拦截通知,需要特殊权限。这是您可以用来打开设置页面的代码,用户必须在其中允许应用程序收听传入的通知。我将此代码段放在 MainActivityonCreate函数中。

startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS))
Run Code Online (Sandbox Code Playgroud)

如果您需要使用以下代码检查是否授予通知侦听器权限:

private boolean isNotificationServiceEnabled(){
    String pkgName = getPackageName();
    final String flat = Settings.Secure.getString(getContentResolver(),
            ENABLED_NOTIFICATION_LISTENERS);
    if (!TextUtils.isEmpty(flat)) {
        final String[] names = flat.split(":");
        for (String name: names) {
            final ComponentName cn = ComponentName.unflattenFromString(name);
            if (cn != null) {
                if (TextUtils.equals(pkgName, cn.getPackageName())) {
                    return true;
                }
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

PS:我不知道或无法解释它为什么/如何工作,因为我从我 1 岁的项目中复制了代码。

旧答案

我在这 2 篇文章的帮助下收听了传入的 WhatsApp 消息通知,您可以从这里阅读。

  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>
Run Code Online (Sandbox Code Playgroud)
  1. serviceconfig.xml/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"  />
Run Code Online (Sandbox Code Playgroud)
  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

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 准备好了。现在,您可以根据自己的需要定制服务。

注意:由于无障碍服务能够浏览屏幕内容并与之交互,因此用户必须在“设置”>“无障碍”中明确启用服务。更多细节

编辑

要发送对收到通知的回复,请查看此答案。


S.D*_*.D. 5

除非该应用程序的开发人员有意共享服务,内容提供商或有意发送事件的公共广播或公开自定义广播注册系统,否则android中没有合法的方法来监听第三方应用程序的内部运行情况。在Android中设计应用程序隔离的原因很重要:安全性