Listen to incoming Whatsapp messages/notifications

前端 未结 5 986
谎友^
谎友^ 2020-12-07 15:09

I\'m working on a notification based app, for which I need to listen to incoming notifications. I\'ve been able to listen to incoming calls, SMS, mail etc. I have no clue ho

相关标签:
5条回答
  • 2020-12-07 15:32

    I was able to do this using Accessibility Service . Using this, you can listen to all notification on the notification bar. I listened to application-specification by adding the package name to the Accessibility Service service info , which in this case was com.whatsapp. I couldn't read the messages, but I get notified whenever a message arrives.

    0 讨论(0)
  • 2020-12-07 15:33

    See below example to catch whatsapp notifications:

    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();
            }
    
        }
    }
    

    And don't forget to set permission from settings>Accessibility in order to access the system events. Allow permission from settings .

    check this link

    accessibility service is not started

    0 讨论(0)
  • 2020-12-07 15:35

    Accessibility events only catch incoming notifications event, not when they are updated. For now, WhatsApp notifications don't display the message, only the sender. The message is then added by the WhatsApp app with an update, which can't be caught by the accessibility service.

    You will only have something like "1 new message from XXX", but that may be sufficient to your needs.

    0 讨论(0)
  • 2020-12-07 15:37

    Unless Developers of that app intentionally share a service , a content provider, or intentionally send out public broadcasts of events, or expose a custom broadcast registering system, there is no legitimate way in android to listen to internal workings of a third party App. App isolation is designed in Android for a very important reason: security.

    0 讨论(0)
  • 2020-12-07 15:37

    AUG/11/2020 Update

    I have to use NotificationListenerService to get detailed info about notification.

    Here's service code in 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);
        }
    }
    

    And the code required to be placed in 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>
    

    To intercept notifications, a special Permission is required. You can open notification listener settings using the code bellow, I placed this code inside my MainActivity.

    startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS))
    

    And lastly, you can check if permission was given before or not using the code bellow:

    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;
    }
    

    PS: I don't know or can not explain why/how it works because I copied the codes from my 1 year old project.

    Old answer

    I listened to incoming WhatsApp message notifications with the help of this 2 parted article which you can read it from here.

    1. Configure 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. Create a new file called serviceconfig.xml in /xml/ directory.
    <!-- 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. Create a new MyAccessibilityService class which extends 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. It's ready. Now you can customize the service for your needs.

    Note: Because accessibility services are able to explore and interact with on-screen content, a user has to explicitly enable services in Settings > Accessibility. More details

    Edit

    To send replies to received notifications check out this answer.

    0 讨论(0)
提交回复
热议问题