【问题标题】:Whatsapp Notification filtering appWhatsapp 通知过滤应用程序
【发布时间】:2017-06-10 21:10:20
【问题描述】:

我正在尝试构建 Whatsapp 通知过滤应用程序,我在其中监视来自 Whatsapp 的所有通知并使用某些过滤器删除消息。 那么有人可以帮助我如何捕获这些通知消息,以便我可以操纵它们 我知道我必须使用无障碍服务,但我无法获得任何活动 我得到的只是空事件源也是空的

https://stackoverflow.com/users/2452075/ghmulchandani

我的代码是:- 使用无障碍服务

MainActivity.java

package com.example.pavilion.accessebilityone;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    static TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.textView);
        Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
        startActivityForResult(intent, 0);

        Intent service = new Intent(this,WhatsappService.class);
        startService(service);
    }
}

无障碍服务类:-

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Notification;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo;
import android.widget.RemoteViews;
import android.widget.TextView;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by pavilion on 6/6/2017.
 */
public class WhatsappService extends AccessibilityService {

    protected void onServiceConnected() {
        Toast.makeText(this, "connectd", Toast.LENGTH_SHORT).show();
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        info.notificationTimeout = 100;
        setServiceInfo(info);
    }

    public synchronized void onAccessibilityEvent(AccessibilityEvent event) {

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

            CharSequence pk = event.getPackageName();
            //Toast.makeText(this,cl,Toast.LENGTH_SHORT).show();
            Toast.makeText(this, pk, Toast.LENGTH_SHORT).show();
            Notification n = (Notification) event.getParcelableData();

            if (n == null)
                return;

            RemoteViews rv = n.contentView;
            View view = rv.apply(this, null);

            if (view == null)
                return;

            if (view instanceof ViewGroup) {
                ViewGroup group = (ViewGroup) view;
                searchTextView(group);
            }
        }
    }

    @Override
    public void onInterrupt() {
    }


    private void searchTextView(ViewGroup group) {
        int count = group.getChildCount();

        for (int i = 0; i < count; i++) {
            View v = group.getChildAt(i);

            if (v instanceof TextView) {
               Toast.makeText(this,((TextView) v).getText(),Toast.LENGTH_SHORT).show();
            } else if (v instanceof ViewGroup) {
                searchTextView((ViewGroup) v);
            }
        }
    }
}

清单文件:-

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pavilion.accessebilityone">
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".WhatsappService"

            android:enabled="true"
            android:exported="true"

            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <action android:name="android.accessibilityservice.AccessibilityService"/>
            </intent-filter>
            <meta-data android:name="android.accessibilityservice"
                android:resource="@xml/accessibilityservice"/>


        </service>

    </application>

</manifest>

可访问性-服务 xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    android:accessibilityEventTypes="typeNotificationStateChanged"


    android:accessibilityFeedbackType="feedbackGeneric"
    android:canRetrieveWindowContent="true"
    android:notificationTimeout="100"

    android:settingsActivity="com.example.pavilion.accessebilityone.MainActivity"
    xmlns:android="http://schemas.android.com/apk/res/android">



</accessibility-service>

【问题讨论】:

  • 我不知道为什么人们不赞成,这是个好问题

标签: android notifications whatsapp accessibilityservice


【解决方案1】:

你需要扩展通知监听服务。

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public class WhatsappNotifcationListener extends NotificationListenerService {

    @Override
    public IBinder onBind(Intent intent) {
        return super.onBind(intent);
    }

    @Override
    public void onNotificationPosted(StatusBarNotification statusBarNotification) {
        String packageName = statusBarNotification.getPackageName();
        Bundle extras = statusBarNotification.getNotification().extras;

        if (extras.getCharSequence("android.text") == null) {
            return;
        }

        String message = extras.getCharSequence("android.text").toString();
        String notificationTitle = extras.getString(Notification.EXTRA_TITLE);
        if (notificationTitle == null) {
            return;
        }

        handleNotification(packageName, notificationTitle, message);

    }

    @Override
    public void onNotificationRemoved(StatusBarNotification statusBarNotification) {
        super.onNotificationRemoved(statusBarNotification);
    }

    private void handleNotification(String packageName, String notificationTitle, String message) {

        if(!packageName.equalsIgnoreCase("whatsapp packagename"))){
            return;
        }
        //Do something with notification title and notification message

    }

}

要提示用户授予通知访问权限,请在活动中使用以下命令:

activity.startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));

确保在标记内的清单文件中包含以下内容:

<service
    android:name=".WhatsappNotifcationListener"
    android:enabled="true"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

【讨论】:

  • 我这样做的方式与没有显示任何内容的方式相同我使用 toast 来生成我的设备是 Moto G3 android 版本 6.0.1我不知道为什么它没有捕获通知而不是 handleNotification(packageName, notificationTitle, message);我用 Toast 来显示名称、标题、消息
  • 好的,在手机上安装好应用程序后,重启手机。我注意到对于应用程序的调试版本,这是必需的。
  • 只能获取网速通知,无法获取whatsapp或其他通知。事实上,它甚至没有考虑将whatsapp 作为通知,因为它至少应该为whatsapp 包生成toast,但它根本没有提到whatsapp
  • 获取notification read permission 为我工作!谢谢@archLucifer activity.startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 2022-12-31
  • 2013-09-07
  • 2023-01-19
  • 1970-01-01
相关资源
最近更新 更多