1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

WhatsApp Notification bzw. neue Nachricht abfragen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ChrisMobile, 16.05.2012.

  1. ChrisMobile, 16.05.2012 #1
    ChrisMobile

    ChrisMobile Threadstarter Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Hallo zusammen,

    ich möchte eine App basteln, die neue WhatsApp Nachrichten direkt auf dem Lockscreen (Sense4) ausgibt.
    Mit SMS ist das ja nicht so schwierig aber ich finde keine Möglichkeit auf neue Whatsapp Nachrichten zu reagieren.

    Im Logcat wird mir nichts brauchbares angezeigt, wenn eine neue Nachricht eingeht.
    Ich habe sonst noch überlegt die Notifications auszulesen aber dazu auch keine Möglichkeit im Android SDK gefunen.

    Viele Grüße
    Chris
     
    Zuletzt bearbeitet: 16.05.2012
  2. mkl, 17.05.2012 #2
    mkl

    mkl Fortgeschrittenes Mitglied

    Beiträge:
    316
    Erhaltene Danke:
    33
    Registriert seit:
    09.01.2011
    Evtl mal die Entwickler von Missed It! fragen?

    Gruß mkl

    Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
     
  3. beowulf6, 26.05.2012 #3
    beowulf6

    beowulf6 Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    4
    Registriert seit:
    16.05.2012
    Auch wenn es vielleicht etwas spät kommt:

    Mit einem AccessibilityService ist es eigentlich nicht allzu schwierig Nachrichten abzufangen. Muss nur eben explizit vom Benutzer in den Android Einstellungen aktiviert werden.

    Ohne Garantie das es funktioniert:

    AccessibilityService:
    Code:
    public class MyAccessibilityService extends AccessibilityService {
    	
    	@Override
        public void onCreate() {
            super.onCreate();
        }
    	
    	private void sendToMain(String message) {
    		
    		Intent intent=new Intent("whatsapp.notifier.receiver");
    		intent.putExtra("message",message);
    		sendBroadcast(intent);
    
    	}
    
    	@Override
    	public void onAccessibilityEvent(AccessibilityEvent event) {
    		
    		final int eventType = event.getEventType();
    		
    	    String eventText = "";
    	    switch(eventType) {
    
    	    	case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
    		    		StringBuilder sb = new StringBuilder();
    		            for (CharSequence s : event.getText()) {
    		                sb.append(s);
    		            }
    		            eventText = sb.toString();
    
    		            String notificationText = "";
    		            String infoTitle = "";
    		            String infoText = "";
    		            String infoText2 = "";
    		            
    		            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());
    		                        }
    		                    }
    		                }
    		                for (String value : text.values()) {
    	                    	infoText = infoText + " " + value;
                        	}
    		            } catch (Exception e) {
    		                e.printStackTrace();
    		            }
    
    	    			eventText = infoText;
    
    		    	    sendToMain(eventText);
    		    	    
    		    	    //CancelNotification(this, event.getCurrentItemIndex());
    		    	    
    	    		break;
    	    }
    
    	    
    	    // Do something nifty with this text, like speak the composed string
    	    // back to the user.
    	}
    	
    	public static void CancelNotification(Context ctx, int notifyId) {
    	    String ns = Context.NOTIFICATION_SERVICE;
    	    NotificationManager nMgr = (NotificationManager) ctx.getSystemService(ns);
    	    nMgr.cancel(notifyId);
    	}
    	
    
    
    	@Override
    	public void onInterrupt() {
    		// TODO Auto-generated method stub
    	}
    	
    	
    	@Override
    	public void onServiceConnected() {
    		Log.d("TAS", "onServiceConnected");
    		setServiceInfo();
    	}
    	
    
    	private void setServiceInfo() {
            AccessibilityServiceInfo info = new AccessibilityServiceInfo();
            // We are interested in all types of accessibility events.
            info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
            // We want to provide specific type of feedback.
            info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
            // We want to receive events in a certain interval.
            info.notificationTimeout = 100;
            // We want to receive accessibility events only from certain packages.
    
            // only handle this package
            //info.packageNames[0] = getPackageName();
            //info.packageNames = new String[] {"com.whatsapp", "com.android.email"};
            info.packageNames = new String[] {"com.whatsapp"};
            
            setServiceInfo(info);
    
    	}
    	    
    	 
    }
    Receiver:
    Code:
    private class Receiver extends BroadcastReceiver {
    
        	 @Override
        	 public void onReceive(Context arg0, Intent arg1) {
        	    String message = arg1.getExtras().getString("message");
    
        	    addData("WhatsApp", message);
        	 }
    
        }
    und nicht das Manifest vergessen:
    Code:
    <service android:name=".MyAccessibilityService">
    	     <intent-filter>
    	         <action android:name="android.accessibilityservice.AccessibilityService" />
    	     </intent-filter>
    </service>
     
    GENiALi und ChrisMobile haben sich bedankt.
  4. ChrisMobile, 29.05.2012 #4
    ChrisMobile

    ChrisMobile Threadstarter Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Danke für den Tipp.
    Ich werde es die Tage mal damit versuchen.

    Leider zicken die HTC Server seit Tagen, daher konnte ich das OpenSenseSDK noch nicht installieren.
     

Diese Seite empfehlen