2017-06-09 14 views
-2

Whatsapp通知フィルタリングアプリケーションを作成しようとしています。ここで、Whatsappからのすべての通知を監視し、いくつかのフィルタを使用してメッセージを削除します。 私はそれらの通知メッセージをキャッチして、それらを操作できるように助けてもらえますか アクセシビリティサービスを使用する必要があることは分かっていましたが、イベントを取得することができません nullイベントソースもnullですWhatsapp通知フィルタリングアプリケーション

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

私のコードは次のとおりです。 - Accessib

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); 
    } 
} 
をアクセシビリティサービスを使用してilityサービスクラス: -

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> 

アクセシビリティ-serviceの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> 

答えて

0

あなたは通知リスナーサービスを拡張する必要があります。活動中で次のように使用した通知のアクセス権を与えるを促す

@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> 
+0

私はそれが何も表示されていない同じ方法を行った私は私のデバイスはMoto G3アンドロイドバージョン6.0.1です情報を生成するために乾杯を使用した| なぜそれが通知をキャッチしていないのかわかりません。 handleNotification(packageName、notificationTitle、message)ではなく;これは、名前、タイトル、メッセージを表示するためにToastを使用しました。 – kanhaiyabgs

+0

さて、アプリケーションを携帯電話にインストールしたら、電話を再起動してください。私は、アプリケーションのデバッグバージョンでは、これが必要であることに気付きました。 – archLucifer

+0

インターネット速度通知のみを取得することができ、whatsappやその他の通知を受け取ることができません。事実、whatsappは通知として考慮されていません。なぜなら少なくともwhatsappパッケージのトーストを生成するはずですが、whatsappは全く言及していないからです。 – kanhaiyabgs

関連する問題