App stürzt ab wenn öffnen durch Push-Nachricht

  • Antworten:14
  • Bentwortet
Tim B
  • Forum-Beiträge: 13

28.11.2013, 21:52:31 via Website

Hey!
Ich bin relativ neu in der Android-App-Entwicklung und hier im Forum und danke schonmal für jegliche Hilfe! :)

Ich habe ein App geschrieben, die relativ simpel GCM Nachrichten empfängt. Dies soll später dazu dienen, den User zu informieren, dass etwas innerhalb der App aktualisiert wurde. Soweit klappt das auch alles ideal. Die Push-Nachrichten kommen an und wenn die App geöffnet ist, läuft auch alles.
Wenn die App allerdings beendet ist und eine Nachricht von GCM empfängt, auf die man klickt, wird versucht, die App zu öffnen, allerdings stürzt sie direkt danach ab. Danach ist es auch nicht mehr möglich, die App zu starten außer man schließt sie zuvor wieder per Task-Manager.

Das Problem scheint es öfter zu geben, allerdings habe ich noch keine für mich passende Lösung gefunden, da es bei anderen meist daran lag, dass sie andere Push-Dienste als GCM genutzt haben, was bei mir aber nicht der Fall ist.

Hatte jemand von euch schon einmal ein ähnliches Problem und kennt evtl. eine Lösung? Es würde mir sehr weiterhelfen! :)

Vielen Dank im Vorraus Tim

Antworten
impjor
  • Forum-Beiträge: 1.793

28.11.2013, 22:13:39 via App

Wenn deine App abstürzt, wird das im Logcat vermerkt. Das sagt dir wann, wo, wie und warum deine App gecrasht ist. Sieh dir das mal an.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
JOnas S
  • Forum-Beiträge: 2.256

28.11.2013, 22:28:45 via App

ist denn die activity die offen ist die gleiche die auch ausgeführt wird ?

gruß Jonas ||Galaxy S with cm10.1 4.2.1|| gegen überlange Zitate

Antworten
Tim B
  • Forum-Beiträge: 13

28.11.2013, 22:36:24 via Website

Oh, sorry! LogCat sagt:
111-28 16:34:34.542: E/SoundPool(928): error loading /system/media/audio/ui/Effect_Tick.ogg
211-28 16:34:34.542: E/SoundPool(928): error loading /system/media/audio/ui/Effect_Tick.ogg
311-28 16:34:34.542: E/SoundPool(928): error loading /system/media/audio/ui/Effect_Tick.ogg
411-28 16:34:34.542: E/SoundPool(928): error loading /system/media/audio/ui/Effect_Tick.ogg
511-28 16:34:34.562: E/SoundPool(928): error loading /system/media/audio/ui/Effect_Tick.ogg
611-28 16:34:34.562: E/SoundPool(928): error loading /system/media/audio/ui/KeypressStandard.ogg
711-28 16:34:34.592: E/SoundPool(928): error loading /system/media/audio/ui/KeypressSpacebar.ogg
811-28 16:34:34.592: E/SoundPool(928): error loading /system/media/audio/ui/KeypressDelete.ogg
911-28 16:34:34.622: E/SoundPool(928): error loading /system/media/audio/ui/KeypressReturn.ogg
1011-28 16:34:36.522: E/AndroidRuntime(1504): FATAL EXCEPTION: main
1111-28 16:34:36.522: E/AndroidRuntime(1504): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.pushnotifications/com.androidhive.pushnotifications.MainActivity}: java.lang.NullPointerException
1211-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
1311-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
1411-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.ActivityThread.access$600(ActivityThread.java:141)
1511-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
1611-28 16:34:36.522: E/AndroidRuntime(1504): at android.os.Handler.dispatchMessage(Handler.java:99)
1711-28 16:34:36.522: E/AndroidRuntime(1504): at android.os.Looper.loop(Looper.java:137)
1811-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.ActivityThread.main(ActivityThread.java:5103)
1911-28 16:34:36.522: E/AndroidRuntime(1504): at java.lang.reflect.Method.invokeNative(Native Method)
2011-28 16:34:36.522: E/AndroidRuntime(1504): at java.lang.reflect.Method.invoke(Method.java:525)
2111-28 16:34:36.522: E/AndroidRuntime(1504): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
2211-28 16:34:36.522: E/AndroidRuntime(1504): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
2311-28 16:34:36.522: E/AndroidRuntime(1504): at dalvik.system.NativeStart.main(Native Method)
2411-28 16:34:36.522: E/AndroidRuntime(1504): Caused by: java.lang.NullPointerException
2511-28 16:34:36.522: E/AndroidRuntime(1504): at com.androidhive.pushnotifications.MainActivity.onCreate(MainActivity.java:64)
2611-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.Activity.performCreate(Activity.java:5133)
2711-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
2811-28 16:34:36.522: E/AndroidRuntime(1504): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
2911-28 16:34:36.522: E/AndroidRuntime(1504): ... 11 more

Ich verstehe leider nicht genau, woher die Exceptions kommen..

Edit:
Normalerweise habe ich als Start-Activity die Activity "Register", die checkt, ob man bei GCM registriert ist. Wenn ich das jetzt so sehe, sieht es mir aber so aus, als würder er die Main-Activity starten. Kann das sein?
& da die Register-Activity normalerweise 2 Werte an Main weitergibt, stürzt Main ab, da diese fehlen. Ich werde mal schauen, ob es daran liegt.

Edit2: Ich habe jetzt alle Möglichkeiten getestet und komm einfach nicht drauf.. :/
Macht es überhaupt Sinn, dass durch die Push-Benachrichtigung direkt die Main-Activity geöffnet werden soll?
Oder liegt der Fehler wahrscheinlich bei Register?

— geändert am 28.11.2013, 23:17:27

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

29.11.2013, 00:23:55 via Website

MainActivity.java:64

Da knallt es laut Log, einfach mal schauen was da im Source steht.

Antworten
Tim B
  • Forum-Beiträge: 13

29.11.2013, 23:24:43 via Website

Vielen Dank!
Nachdem ich das Ganze ein bisschen umgeschrieben habe ist er jetzt in Zele 79, die Lautet:

1if (name.equals("schonregistriert!!")){

Name wird in den Zeilen zuvor eigentlich festgelegt:
1try {
2 Intent i = getIntent();
3 name = i.getStringExtra("name");
4 email = i.getStringExtra("email");
5 } catch (Exception e) {
6 //System.out.println("Da ist wohl ein Fehler aufgetreten");
7 name = "schonregistriert!!";
8 email = "egal";
9 }

Da ich mir nicht sicher war, ob es am Auslesen des Intents liegt, habe ich das allerdings mit Try gemacht. Aber im Prinzip sollte doch Name unter allen Umständen einen Wert besitzen, warum schmeißt er mir dann hier einen Fehler?

Antworten
Tim B
  • Forum-Beiträge: 13

29.11.2013, 23:33:50 via Website

Ja, genau ;)
Es ist ein BroadcastReceiver in der MainActivity. Aber inwiefern kann es dadurch zu einem Problem kommen?
Das verstehe ich ehrlich gesagt nicht ganz :/

Antworten
Tim B
  • Forum-Beiträge: 13

30.11.2013, 00:08:24 via Website

Hey!
Ich weiß nicht, was du mit Log meinst. Aber LogCat steht im oberen Beitrag. Die Zeilen haben sich geändert, weil ich versucht habe, den Fehler zu beheben, ber sonst ist der Fehler immer noch der gleiche. Sieht aus wie eine Null-Exception, oder? Ich verstehe den Log ehrlich gesagt nicht ganz.
Oder braucht man noch einen anderen Log dazu?

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

30.11.2013, 00:25:25 via Website

Aber im Prinzip sollte doch Name unter allen Umständen einen Wert besitzen, warum schmeißt er mir dann hier einen Fehler?

Doku:

public String getStringExtra (String name)

Added in API level 1
Retrieve extended data from the intent.

Parameters
name The name of the desired item.
Returns
the value of an item that previously added with putExtra() or null if no String value was found.

Antworten
Tim B
  • Forum-Beiträge: 13

30.11.2013, 00:32:06 via Website

or null if no String value was found.
Aber durch
1name = "schonregistriert!!";
wird doch selbst im Fehlerfall ein Wert gesetzt? Daran sollte es doch dadurch nicht liegen?

Der komplette Code meiner Mainactivity ist folgender:
1package com.androidhive.pushnotifications;
2
3import static com.androidhive.pushnotifications.CommonUtilities.DISPLAY_MESSAGE_ACTION;
4import static com.androidhive.pushnotifications.CommonUtilities.EXTRA_MESSAGE;
5import static com.androidhive.pushnotifications.CommonUtilities.SENDER_ID;
6import android.R;
7import android.app.Activity;
8import android.content.BroadcastReceiver;
9import android.content.Context;
10import android.content.Intent;
11import android.content.IntentFilter;
12import android.os.AsyncTask;
13import android.os.Bundle;
14import android.util.Log;
15import android.webkit.WebSettings;
16import android.webkit.WebSettings.ZoomDensity;
17import android.webkit.WebView;
18import android.webkit.WebViewClient;
19import android.widget.TextView;
20import android.widget.Toast;
21
22import com.google.android.gcm.GCMRegistrar;
23
24public class MainActivity extends Activity {
25 // label to display gcm messages
26 TextView lblMessage;
27
28 // Asyntask
29 AsyncTask<Void, Void, Void> mRegisterTask;
30
31 // Alert dialog manager
32 AlertDialogManager alert = new AlertDialogManager();
33
34 // Connection detector
35 ConnectionDetector cd;
36
37 public static String name;
38 public static String email;
39
40 @Override
41 public void onCreate(Bundle savedInstanceState) {
42 super.onCreate(savedInstanceState);
43 setContentView(com.androidhive.pushnotifications.R.layout.activity_main);
44
45
46 try{
47 cd = new ConnectionDetector(getApplicationContext());
48
49 // Check if Internet present
50 if (!cd.isConnectingToInternet()) {
51 // Internet Connection is not present
52 alert.showAlertDialog(MainActivity.this,
53 "Internet Connection Error",
54 "Please connect to working Internet connection", false);
55 // stop executing code by return
56 return;
57 }
58 }catch (Exception e) {
59
60 }
61
62
63 // Getting name,email from intent
64
65
66
67 try {
68 Intent i = getIntent();
69 name = i.getStringExtra("name");
70 email = i.getStringExtra("email");
71 } catch (Exception e) {
72 //System.out.println("Da ist wohl ein Fehler aufgetreten");
73 name = "schonregistriert!!";
74 email = "egal";
75 }
76
77
78
79 if (name.equals("schonregistriert!!")){
80 }else{
81 // Make sure the device has the proper dependencies.
82 GCMRegistrar.checkDevice(this);
83
84 // Make sure the manifest was properly set - comment out this line
85 // while developing the app, then uncomment it when it's ready.
86 GCMRegistrar.checkManifest(this);
87
88 //lblMessage = (TextView) findViewById(R.id.lblMessage);
89
90 registerReceiver(mHandleMessageReceiver, new IntentFilter(
91 DISPLAY_MESSAGE_ACTION));
92
93 // Get GCM registration id
94 final String regId = GCMRegistrar.getRegistrationId(this);
95
96 // Check if regid already presents
97 if (regId.equals("")) {
98 // Registration is not present, register now with GCM
99 GCMRegistrar.register(this, SENDER_ID);
100 } else {
101 // Device is already registered on GCM
102 if (GCMRegistrar.isRegisteredOnServer(this)) {
103 // Skips registration.
104 Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show();
105 } else {
106 // Try to register again, but not in the UI thread.
107 // It's also necessary to cancel the thread onDestroy(),
108 // hence the use of AsyncTask instead of a raw thread.
109 final Context context = this;
110 mRegisterTask = new AsyncTask<Void, Void, Void>() {
111
112 @Override
113 protected Void doInBackground(Void... params) {
114 // Register on our server
115 // On server creates a new user
116 ServerUtilities.register(context, name, email, regId);
117 return null;
118 }
119
120 @Override
121 protected void onPostExecute(Void result) {
122 mRegisterTask = null;
123 }
124
125 };
126 mRegisterTask.execute(null, null, null);
127 }
128 }
129 }
130
131 String url = "url";
132
133 WebView wbb = (WebView) findViewById(com.androidhive.pushnotifications.R.id.webView1);
134 wbb.setWebViewClient(new WebViewClient());
135 wbb.loadUrl(url);
136 //wbb.getSettings().setDefaultZoom(ZoomDensity.FAR);
137
138 wbb.getSettings().setLoadWithOverviewMode(true);
139 wbb.getSettings().setUseWideViewPort(true);
140
141 wbb.getSettings().setBuiltInZoomControls(true);
142
143
144 }
145
146 /**
147 * Receiving push messages
148 * */
149 private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
150 @Override
151 public void onReceive(Context context, Intent intent) {
152 String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
153 // Waking up mobile if it is sleeping
154 WakeLocker.acquire(getApplicationContext());
155
156 /**
157 * Take appropriate action on this message
158 * depending upon your app requirement
159 * For now i am just displaying it on the screen
160 * */
161
162 // Showing received message
163 //lblMessage.append(newMessage + "\n");
164 //Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show();
165
166 // Releasing wake lock
167 WakeLocker.release();
168 }
169 };
170
171 @Override
172 protected void onDestroy() {
173 if (mRegisterTask != null) {
174 mRegisterTask.cancel(true);
175 }
176 try {
177 unregisterReceiver(mHandleMessageReceiver);
178 GCMRegistrar.onDestroy(this);
179 } catch (Exception e) {
180 Log.e("UnRegister Receiver Error", "> " + e.getMessage());
181 }
182 super.onDestroy();
183 }
184
185}
Habe soviel wie möglich jetzt aus einem Beispielcode behalten, um Fehler von meiner Seite vorzubeugen.
Dabei gibts immer noch den Fehler. Den genauen Logg zu exakt diesem Code mit richtigen Zeilen editiere ich gleich rein.

Der LogCat gibt:
111-29 18:40:16.641: V/GCMBroadcastReceiver(1006): onReceive: com.google.android.c2dm.intent.RECEIVE
211-29 18:40:16.641: V/GCMBroadcastReceiver(1006): GCM IntentService class: com.androidhive.pushnotifications.GCMIntentService
311-29 18:40:16.651: V/GCMBaseIntentService(1006): Acquiring wakelock
411-29 18:40:16.682: V/GCMBaseIntentService(1006): Intent service name: GCMIntentService-693398460593-1
511-29 18:40:16.691: I/GCMIntentService(1006): Received message
611-29 18:40:16.901: V/GCMBaseIntentService(1006): Releasing wakelock
711-29 18:40:23.140: D/dalvikvm(1006): GC_FOR_ALLOC freed 75K, 8% free 2695K/2904K, paused 203ms, total 208ms
811-29 18:40:23.201: I/dalvikvm-heap(1006): Grow heap (frag case) to 3.365MB for 635812-byte allocation
911-29 18:40:23.321: D/dalvikvm(1006): GC_FOR_ALLOC freed 2K, 7% free 3313K/3528K, paused 119ms, total 119ms
1011-29 18:40:23.661: D/AndroidRuntime(1006): Shutting down VM
1111-29 18:40:23.661: W/dalvikvm(1006): threadid=1: thread exiting with uncaught exception (group=0x41465700)
1211-29 18:40:23.801: E/AndroidRuntime(1006): FATAL EXCEPTION: main
1311-29 18:40:23.801: E/AndroidRuntime(1006): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.pushnotifications/com.androidhive.pushnotifications.MainActivity}: java.lang.NullPointerException
1411-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
1511-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
1611-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.ActivityThread.access$600(ActivityThread.java:141)
1711-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
1811-29 18:40:23.801: E/AndroidRuntime(1006): at android.os.Handler.dispatchMessage(Handler.java:99)
1911-29 18:40:23.801: E/AndroidRuntime(1006): at android.os.Looper.loop(Looper.java:137)
2011-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.ActivityThread.main(ActivityThread.java:5103)
2111-29 18:40:23.801: E/AndroidRuntime(1006): at java.lang.reflect.Method.invokeNative(Native Method)
2211-29 18:40:23.801: E/AndroidRuntime(1006): at java.lang.reflect.Method.invoke(Method.java:525)
2311-29 18:40:23.801: E/AndroidRuntime(1006): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
2411-29 18:40:23.801: E/AndroidRuntime(1006): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
2511-29 18:40:23.801: E/AndroidRuntime(1006): at dalvik.system.NativeStart.main(Native Method)
2611-29 18:40:23.801: E/AndroidRuntime(1006): Caused by: java.lang.NullPointerException
2711-29 18:40:23.801: E/AndroidRuntime(1006): at com.androidhive.pushnotifications.MainActivity.onCreate(MainActivity.java:79)
2811-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.Activity.performCreate(Activity.java:5133)
2911-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
3011-29 18:40:23.801: E/AndroidRuntime(1006): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
3111-29 18:40:23.801: E/AndroidRuntime(1006): ... 11 more

Tut mir wirklich Leid für den langen Code. :/

— geändert am 30.11.2013, 00:42:22

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.11.2013, 09:47:18 via App

In der Activity tritt eine nullpointerException auf.
Hervorgerufen nach logcat MainActivity.java Zeile 79

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
impjor
  • Forum-Beiträge: 1.793

30.11.2013, 10:07:43 via App

Leere catch-Blöcke sind schon ein Graus, wenigsten Log.e() und e.printStackTrace() verwenden.

Aber anddev hat dir doch die Antwort schon gegeben: getStringExtra liefert null, wenn es nicht gesetzt wurde. Warum sollte da der try-catch-Block anspringen? Der ist sinnlos. Prüfe einfach ob der String == null ist, um zu prüfen, ob etwas gesendet wurde.

LG

Edit: if(name.equuals(...)) {} else { //Code
}
kannst du einfach durch if (!name.equuals(...) {
//Code
}
ersetzen, dann hast du keinen leeren if-Block. Aber wie gesagt, besser auf null prüfen.

— geändert am 30.11.2013, 10:10:48

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Tim B

Antworten
Tim B
  • Forum-Beiträge: 13

30.11.2013, 18:23:44 via Website

Hey!
Vielen Dank! Jetzt funktioniert es. Ich dachte dummerweise, er würde in den Catch-Block springen, wenn der Intent leer ist. Aber das war falsch gedacht von mir.

Auch im leeren Catch-Block stand vorher eigentlich etwas drin, hatte das wohl beim rumprobieren vergessen. Der ist jetzt auch entfernt.

Also vielen Dank nochmal! :)

Antworten