Android 从通知读取WhatsApp消息

Android 从通知读取WhatsApp消息,android,notifications,whatsapp,Android,Notifications,Whatsapp,我正在尝试从通知栏读取传入的WhatsApp消息 我正在使用以下代码来执行此操作 @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public class MyAccessibilityService extends AccessibilityService { private final AccessibilityServiceInfo info = new AccessibilityServiceInfo(); priva

我正在尝试从通知栏读取传入的WhatsApp消息

我正在使用以下代码来执行此操作

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class MyAccessibilityService extends AccessibilityService {

   private final AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    private static final String TAG = "MyAccessibilityService";

    public static TextView title;
    public static TextView inbox;
    public static TextView text;


    @Override
    protected void onServiceConnected()
    {
        Log.d("onServiceConnected", "ServiceConnected");
        try
        {
            AccessibilityServiceInfo info = new AccessibilityServiceInfo();

            info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
            info.packageNames = new String[]
            {"com.whatsapp"};


            info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;

            info.notificationTimeout = 100;

            setServiceInfo(info);
        }
        catch(Exception e)
        {
            Log.d("ERRORonServiceConnected", e.toString());
        }
    }



    @Override
    public void onAccessibilityEvent(AccessibilityEvent event)
    {
        try
        {
            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            Parcelable data = event.getParcelableData();

            if(data != null)
            {
                Notification notification = (Notification) data;

                RemoteViews remoteView = notification.contentView;

                ViewGroup localView = (ViewGroup) inflater.inflate(remoteView.getLayoutId(), null);

                remoteView.reapply(getApplicationContext(), localView);

                Resources resources = null;

                PackageManager pkm = getPackageManager();

                try
                {
                    resources = pkm.getResourcesForApplication("com.whatsapp");
                }
                catch (PackageManager.NameNotFoundException e)
                {
                    e.printStackTrace();
                }

                if (resources == null)
                    return;

                int TITLE = resources.getIdentifier("android:id/title", null, null);

                int INBOX = resources.getIdentifier("android:id/big_text", null, null);

                int TEXT = resources.getIdentifier("android:id/text", null, null);

                String packagename = String.valueOf(event.getPackageName());

                title = (TextView) localView.findViewById(TITLE);

                inbox = (TextView) localView.findViewById(INBOX);

                text = (TextView) localView.findViewById(TEXT);

                Log.d("NOTIFICATION Package : ", packagename);

                Log.d("NOTIFICATION Title : ", title.getText().toString());

                Log.d("got x messages : ", text.getText().toString());

                Log.d("NOTIFICATION inbox : ", inbox.getText().toString());
        }
        }
        catch(Exception e)
        {
            Log.e("onAccessibilityEvent", e.toString());
        }
    }
}
当接收到WhatsApp消息时,它会在日志中显示以下错误

E/onAccessibilityEvent﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.RemoteViews.getLayoutId()'on a null object reference
注: 我没有添加任何特定权限。
请帮我纠正这个错误。我对此特别陌生。

试试这个,下面的代码适合我-

Notification notification = (Notification) event.getParcelableData();
RemoteViews views = notification.contentView;
Class secretClass = views.getClass();

try {
 Map<Integer, String> text = new HashMap<Integer, String>();

 Field outerFields[] = secretClass.getDeclaredFields();
 for (int i = 0; i < outerFields.length; i++) {
    if (!outerFields[i].getName().equals("mActions")) continue;

    outerFields[i].setAccessible(true);

    ArrayList<Object> actions = (ArrayList<Object>) outerFields[i]
            .get(views);
    for (Object action : actions) {
        Field innerFields[] = action.getClass().getDeclaredFields();

        Object value = null;
        Integer type = null;
        Integer viewId = null;
        for (Field field : innerFields) {
            field.setAccessible(true);
            if (field.getName().equals("value")) {
                value = field.get(action);
            } else if (field.getName().equals("type")) {
                type = field.getInt(action);
            } else if (field.getName().equals("viewId")) {
                viewId = field.getInt(action);
            }
        }

        if (type == 9 || type == 10) {
            text.put(viewId, value.toString());
        }
    }

    System.out.println("title is: " + text.get(16908310));
    System.out.println("info is: " + text.get(16909082));
    System.out.println("text is: " + text.get(16908358));
     }
  } catch (Exception e) {
e.printStackTrace();
}
Notification Notification=(Notification)event.getParcelableData();
RemoteViews=notification.contentView;
Class secretClass=views.getClass();
试一试{
映射文本=新的HashMap();
Field outerFields[]=secretClass.getDeclaredFields();
for(int i=0;i
希望它能帮助你

在res文件夹中创建一个名为xml的文件夹-在其中创建一个名为“accessibilityservice”的xml,并粘贴到下面的代码中-

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service  
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100" />
<service
    android:name=".YourServiceClassName"
    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/accessibilityservice" />
</service> 

和内部清单将您的服务标签更新为以下代码-

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service  
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100" />
<service
    android:name=".YourServiceClassName"
    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/accessibilityservice" />
</service> 

试试这个,下面的代码适合我-

Notification notification = (Notification) event.getParcelableData();
RemoteViews views = notification.contentView;
Class secretClass = views.getClass();

try {
 Map<Integer, String> text = new HashMap<Integer, String>();

 Field outerFields[] = secretClass.getDeclaredFields();
 for (int i = 0; i < outerFields.length; i++) {
    if (!outerFields[i].getName().equals("mActions")) continue;

    outerFields[i].setAccessible(true);

    ArrayList<Object> actions = (ArrayList<Object>) outerFields[i]
            .get(views);
    for (Object action : actions) {
        Field innerFields[] = action.getClass().getDeclaredFields();

        Object value = null;
        Integer type = null;
        Integer viewId = null;
        for (Field field : innerFields) {
            field.setAccessible(true);
            if (field.getName().equals("value")) {
                value = field.get(action);
            } else if (field.getName().equals("type")) {
                type = field.getInt(action);
            } else if (field.getName().equals("viewId")) {
                viewId = field.getInt(action);
            }
        }

        if (type == 9 || type == 10) {
            text.put(viewId, value.toString());
        }
    }

    System.out.println("title is: " + text.get(16908310));
    System.out.println("info is: " + text.get(16909082));
    System.out.println("text is: " + text.get(16908358));
     }
  } catch (Exception e) {
e.printStackTrace();
}
Notification Notification=(Notification)event.getParcelableData();
RemoteViews=notification.contentView;
Class secretClass=views.getClass();
试一试{
映射文本=新的HashMap();
Field outerFields[]=secretClass.getDeclaredFields();
for(int i=0;i
希望它能帮助你

在res文件夹中创建一个名为xml的文件夹-在其中创建一个名为“accessibilityservice”的xml,并粘贴到下面的代码中-

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service  
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100" />
<service
    android:name=".YourServiceClassName"
    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/accessibilityservice" />
</service> 

和内部清单将您的服务标签更新为以下代码-

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service  
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100" />
<service
    android:name=".YourServiceClassName"
    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/accessibilityservice" />
</service> 


检查此项。我想问我是否需要清单中的任何权限。检查此项。我想问我是否需要清单中的任何权限。