Hilfe bei App Programmierung: Notification Listener

  • 4 Antworten
  • Neuester Beitrag
Diskutiere Hilfe bei App Programmierung: Notification Listener im Android App Entwicklung im Bereich Betriebssysteme & Apps.
C

cqp

Neues Mitglied
Hi,

ich studiere noch Wirtschaftsinformatik, kann daher bissl Java, hätte mir das aber mit der App programmieren etwas einfacher vorgestellt, daher bräuchte ich jetzt etwas Hilfe.
Zu der App:
Ich habe eine App auf meinem Smartphone, welches mir Push-Mitteilungen schicken kann, aber ich kann dort keinen Sound oder ähnliches einstellen, außerdem ist es elementar wichtig, dass es so lange vibriert / sound abspielt bis ich es selber beende! Daher auch die App. Die App soll später noch erweitertet werden, aber erst mal soll das laufen.

Ich habe mich an dem Beispiel von kpbird entlang gehangelt...

Allerdings habe ich noch Probleme...im Prinzip funktioniert die App, also es wird die Notifikation von der App (CMC Markets) erkannt und dann startet der mp und die vibration, wenn ich dann auf den Stopp Button klicke, stoppt auch beides. Wenn ich dann die Notification aber lösche, vibriert und klingelt es erneut, kann ich aber mit dem Stopp Button wieder beenden.
Wenn ich allerdings zuerst die Push Nachricht lösche, dann startet ein "neuer" mp der sound wird überlagert jetzt kann ich mit Stopp nur einen Sound/Vibration beenden, der Rest läuft weiter...

Wenn kein Sound/Vibration abgespielt wird und ich dann auf Stopp klicke, stürzt die App ab, Fehlermeldung:


Ist unschön, aber im Prinzip nicht so wichtig mit dem abstürzen...

Dann funktioniert die App wie oben komischerweise Minuten lang und dann, wenn ich das Smartphone nicht mehr am Rechner dran habe und ein paar Stunden später geht sie nicht mehr... Auch wenn ich sie neu starte, geht nicht, wenn ich dann über Eclipse neu lade gehts komischerweise wieder...
Wenn ich per Eclispe die App aufs Smartphone lade ist die ja "drauf" oder muss ich die nochmal anders installieren auf dem Smartphone?

Gut wäre auch noch wenn ich mir ausgeben könnte, was CMC Markets da genau für eine Push-Mitteilung gesendet hat, ich seh nur, dass es von der App kommt, aber nicht den Inhalt.

Zusammengefasst: Die App soll die Notifications scannen und wenn etwas von CMC dabei ist Alarm schlagen, Ton und Vibrieren (mit dem MP gehts auch gut, weil wenn das Smartphone lautlos ist, klingelt es trotzdem wenn Medien an ist, so solls auch sein!!), dann soll es einen Stopp Button geben, der Sound/Vibration beendet. Mehr solls eigentlich gar nicht sein erst mal. Wie gesagt, der Inhalt der Nachricht wäre auch noch gut.

So das wars erst mal...ich hoffe mir kann da jemand helfen? :)

Code:
package pack.cmc;


import android.app.Activity;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView txtView;
    private NotificationReceiver nReceiver;
   
    private MediaPlayer mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtView = (TextView) findViewById(R.id.textView);
        nReceiver = new NotificationReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.kpbird.nlsexample.NOTIFICATION_LISTENER_EXAMPLE");
        registerReceiver(nReceiver,filter);
        
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(nReceiver);
    }



    public void buttonClicked(View v){
       
        if(v.getId() == R.id.bStopp){
                       
            Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            mp.setLooping(false);
            mp.reset();
            vib.cancel();
            
        }


    }

    class NotificationReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            
            String temp = intent.getStringExtra("notification_event") + "n" + txtView.getText();
            String erg = "cmcmarkets";
            if (temp.contains(erg)) {
            
            txtView.setText(temp);
            
            Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);       
            long[] pattern = { 0, 500, 100 };            
            System.out.println("CMC-Alarm");
            mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);  
            mp.start();
            mp.setLooping(true);
            vib.vibrate(pattern, 0);
            }
            
        }
    }

}
Code:
package pack.cmc;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

public class NLService extends NotificationListenerService {

    private String TAG = this.getClass().getSimpleName();
    private NLServiceReceiver nlservicereciver;
    @Override
    public void onCreate() {
        super.onCreate();
        nlservicereciver = new NLServiceReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.kpbird.nlsexample.NOTIFICATION_LISTENER_SERVICE_EXAMPLE");
        registerReceiver(nlservicereciver,filter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(nlservicereciver);
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {

        Log.i(TAG,"**********  onNotificationPosted");
        Log.i(TAG,"ID :" + sbn.getId() + "t" + sbn.getNotification().tickerText + "t" + sbn.getPackageName());
        Intent i = new  Intent("com.kpbird.nlsexample.NOTIFICATION_LISTENER_EXAMPLE");
        i.putExtra("notification_event","onNotificationPosted :" + sbn.getPackageName() + "n");
        sendBroadcast(i);

    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        Log.i(TAG,"********** onNOtificationRemoved");
        Log.i(TAG,"ID :" + sbn.getId() + "t" + sbn.getNotification().tickerText +"t" + sbn.getPackageName());
        Intent i = new  Intent("com.kpbird.nlsexample.NOTIFICATION_LISTENER_EXAMPLE");
        i.putExtra("notification_event","onNotificationRemoved :" + sbn.getPackageName() + "n");

        sendBroadcast(i);
    }

    class NLServiceReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getStringExtra("command").equals("clearall")){
                    NLService.this.cancelAllNotifications();
            }
            else if(intent.getStringExtra("command").equals("list")){
                Intent i1 = new  Intent("com.kpbird.nlsexample.NOTIFICATION_LISTENER_EXAMPLE");
                i1.putExtra("notification_event","=====================");
                sendBroadcast(i1);
                int i=1;
                for (StatusBarNotification sbn : NLService.this.getActiveNotifications()) {
                    Intent i2 = new  Intent("com.kpbird.nlsexample.NOTIFICATION_LISTENER_EXAMPLE");
                    i2.putExtra("notification_event",i +" " + sbn.getPackageName() + "n");
                    sendBroadcast(i2);
                    i++;
                }
                Intent i3 = new  Intent("com.kpbird.nlsexample.NOTIFICATION_LISTENER_EXAMPLE");
                i3.putExtra("notification_event","===== Notification List ====");
                sendBroadcast(i3);

            }

        }
    }

}
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="Kein aktueller Alarm"
                android:id="@+id/textView"
                />


    </ScrollView>

    <Button
        android:id="@+id/bStopp"
        android:onClick="buttonClicked"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Stopp Sound" />

</RelativeLayout>
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pack.cmc"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="18"
        android:targetSdkVersion="18" />
        
        <uses-permission android:name="android.permission.VIBRATE"/>
        
    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="pack.cmc.MainActivity"
            android:label="@string/app_name" >
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
             </activity>
            <service android:name="pack.cmc.NLService"
                     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>
            
       
    </application>

</manifest>
 

Anhänge

Zuletzt bearbeitet:
markus.tullius

markus.tullius

Experte
Also in deiner Fehlermeldung steht fast am Schluss, dass ein NullPointerException in der Methode buttomClicked() im der MainActivity (Zeile 49) geworfen wurde.

Meine Vermutung ist, das die Variable mp null ist, und der Fehler bei folgenden Aufruf passiert:
Code:
mp.setLooping(false);
 
C

cqp

Neues Mitglied
Achherje...ja klar.
Habe jetzt bei dem Button Aufruf einfach abgefragt ob mp null ist und jetzt schmiert die App da schon mal nicht mehr ab.
Vielen Dank!

Das nach dem Löschen die App nicht wieder anspringt habe ich jetzt auch. Habe in der NLService einfach die onNotificationRemoved leer gelesen.

Jetzt würde ich gerne noch den gesamten Text der Notification haben :)
 
C

cqp

Neues Mitglied
Weiß keiner wie ich an die komplette Push-Mitteilung komme?
Oder geht das einfach über die ToString vom StatusBarNotification?:huh:
 
C

cqp

Neues Mitglied
Alles klar habs soweit.
Es steckt in der ToString drin muss man sich nur rausholen :)

Damit habe ich soweit alles.

Vielen Dank!
 
Ähnliche Themen - Hilfe bei App Programmierung: Notification Listener Antworten Datum
6
17
6