Notification aus AlarmReciever senden

  • 6 Antworten
  • Letztes Antwortdatum
2

2slow4you

Gast
Guten Tach,
ich hätte da mal ´ne Frage zu meinem aktuellen Problem: ich bin dabei, eine App zu entwickeln, die einen Alarm mit dem AlarmManager setzt, und am Ende soll eine Notification gesendet werden. Mit einem Toast funktioniert das alles, doch wenn ich eine Notification senden will, bekomme ich diese Fehlermeldung:
Code:
03-13 17:03:36.633: E/AndroidRuntime(12854): FATAL EXCEPTION: main
03-13 17:03:36.633: E/AndroidRuntime(12854): Process: de.nico.gpt, PID: 12854
03-13 17:03:36.633: E/AndroidRuntime(12854): java.lang.RuntimeException: Unable to start receiver de.nico.gpt.AlarmReciever: java.lang.NullPointerException
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2426)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.app.ActivityThread.access$1700(ActivityThread.java:135)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.os.Looper.loop(Looper.java:136)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.app.ActivityThread.main(ActivityThread.java:5017)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at java.lang.reflect.Method.invokeNative(Native Method)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at java.lang.reflect.Method.invoke(Method.java:515)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at dalvik.system.NativeStart.main(Native Method)
03-13 17:03:36.633: E/AndroidRuntime(12854): Caused by: java.lang.NullPointerException
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.content.ComponentName.<init>(ComponentName.java:77)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.content.Intent.<init>(Intent.java:3813)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at de.nico.gpt.MainGameActivity.Notification(MainGameActivity.java:1117)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at de.nico.gpt.AlarmReciever.onReceive(AlarmReciever.java:15)
03-13 17:03:36.633: E/AndroidRuntime(12854):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2419)
03-13 17:03:36.633: E/AndroidRuntime(12854):     ... 11 more
Wenn ich das richtig verstanden habe, hängt es daran, dass der AlarmReciever nicht gestartet werden kann, aufgrund einer NullPointerException. Ich weiß aber nicht, wo diese sein soll, da mit dem Toast ja alles klappt...
Hier ist einmal der Code, der den AlarmReciever startet:
Code:
newtime = new GregorianCalendar().getTimeInMillis() + newtime;
Intent intentAlarm = new Intent(this, AlarmReciever.class);
AlarmManager alarmManager = (AlarmManager)             getSystemService(Context.ALARM_SERVICE);
Und hier der Code, der anschließend in der AlarmReciever.class ausgeführt werden soll:
Code:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import de.nico.test.MainGameActivity;

public class AlarmReciever extends BroadcastReceiver {
    
         @Override
            public void onReceive(Context context, Intent intent)
            {            
             MainGameActivity n = new MainGameActivity();
             n.Notification("Test", "Does it works?");
             
             
             //Toast.makeText(context, "Test" + "Test", Toast.LENGTH_LONG).show();
            
             }
     
}
Und hier die Notification Methode:
Code:
public void Notification(String notificationTitle, String notificationMessage) {
        
        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                .setSound(soundUri)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(notificationTitle)
                .setContentText(notificationMessage);
        // Creates an explicit intent for an Activity in your app
        Intent resultIntent = new Intent(this, MainGameActivity.class);

        // The stack builder object will contain an artificial back stack for the
        // started Activity.
        // This ensures that navigating backward from the Activity leads out of
        // your application to the Home screen.
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        // Adds the back stack for the Intent (but not the Intent itself)
        stackBuilder.addParentStack(MainGameActivity.class);
        // Adds the Intent that starts the Activity to the top of the stack
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(
                    0,
                    PendingIntent.FLAG_UPDATE_CURRENT
                );
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        // ranint allows you to update the notification later on.
        ranint = ranint + 1;
        mNotificationManager.notify(ranint, mBuilder.build());
}
Weiß jemand, wo mein Problem liegt?
Vielen Dank schonmal!
 
MainGameActivity n = new MainGameActivity();

Das geht nicht du kannst eine Activity nicht mit new aufrufen (naja du kannst schon aber du sollst nicht).

Wenn das System eine Activity erstellt werden alle nötigen variablen gesetzt z.B. der COntext, wenn du die Activity mit new aufrufst wird gar nichts gesetzt.

Und hier steht auch ziemlich genau wo die NullPointerException geworfen wird.
de.nico.gpt.MainGameActivity.Notification(MainGameActivity.java:1117)

MainActivity Zeile 1117
 
amfa schrieb:
Wenn das System eine Activity erstellt werden alle nötigen variablen gesetzt z.B. der COntext, wenn du die Activity mit new aufrufst wird gar nichts gesetzt.

Und hier steht auch ziemlich genau wo die NullPointerException geworfen wird.
de.nico.gpt.MainGameActivity.Notification(MainGameActivity.java:1117)

MainActivity Zeile 1117

Vielen Dank, ich werde mir das mal heute ansehen!

Edit: Das ist Zeile 1117 in der MainActivity:
Code:
Intent resultIntent = new Intent(this, MainGameActivity.class);

Ich denke mal, "this" ruft die NullPointerException auf. Aber wie kann ich "this" definieren/initialisieren?
 
Zuletzt bearbeitet von einem Moderator:
Weiß niemand Rat?
@amfa Wenn ich eine Activity nicht mit new aufrufen sollte, wie denn dann?
 
markus.tullius schrieb:
Mit einen Intent! Wie es schon in der vorherigen Antwort erwähnt wurde.


Code:
Intent intent = new Intent(this, NewActivity.class);  
startActivity(intent);
Starting Another Activity | Android Developers

Das geht aber auch nicht, da dann zwei Fehlermeldungen kommen...
Bei
Code:
Intent nintent = new Intent(this, MainGameActivity.class);
ist die rechte Seite unterstrichen und es kommt das:
Code:
The constructor Intent(AlarmReciever, Class<MainGameActivity>) is undefined
Und bei
Code:
startActivity(nintent);
ist "startActivity" unterstrichen und es kommt das:
Code:
The method startActivity(Intent) is undefined for the type AlarmReciever
Ist es so schwer eine nicht-statische Methode aus der AlarmReciever Klasse aufzurufen?
Falls mir hier irgendwelches Grundwissen fehlt, kann mir jemand sagen, wo ich mich nochmal einlesen müsste?
 
So, ich hab die Methode jetzt einfach in die Receiver-Klasse gemacht, und jetzt funktionierts:thumbsup::
Code:
public class AlarmReciever extends BroadcastReceiver {
    
         @Override
            public void onReceive(Context context, Intent intent) {     
             showNotification(context);
             }
         
         private void showNotification(Context context) {
             Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                        new Intent(context, MainGameActivity.class), 0);

                NotificationCompat.Builder mBuilder =
                        new NotificationCompat.Builder(context)
                        .setSound(soundUri)
                        .setSmallIcon(R.drawable.ic_notification)
                        .setContentTitle("My App")
                        .setContentText("It works!");
                mBuilder.setContentIntent(contentIntent);
                mBuilder.setDefaults(Notification.DEFAULT_SOUND);
                mBuilder.setAutoCancel(true);
                NotificationManager mNotificationManager =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                mNotificationManager.notify(id, mBuilder.build());

            }  
     
}
Danke nochmal für die Hilfsversuche!:thumbup:
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
487
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten