I am using gcm.jar for Push Notifications. When I start my app I am trying to register Push notifications but it always crashed.
06-04 10:08:32.479: E/BroadcastReceiver(26774): BroadcastReceiver trying to return result during a non-ordered broadcast
06-04 10:08:32.479: E/BroadcastReceiver(26774): java.lang.RuntimeException: BroadcastReceiver trying to return result during a non-ordered broadcast
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.content.BroadcastReceiver.checkSynchronousHint(BroadcastReceiver.java:783)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.content.BroadcastReceiver.setResult(BroadcastReceiver.java:658)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at com.google.android.gcm.GCMBroadcastReceiver.onReceive(GCMBroadcastReceiver.java:56)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2394)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.app.ActivityThread.access$1500(ActivityThread.java:145)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1322)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.os.Handler.dispatchMessage(Handler.java:99)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.os.Looper.loop(Looper.java:137)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at android.app.ActivityThread.main(ActivityThread.java:5095)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at java.lang.reflect.Method.invokeNative(Native Method)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at java.lang.reflect.Method.invoke(Method.java:511)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
06-04 10:08:32.479: E/BroadcastReceiver(26774): at dalvik.system.NativeStart.main(Native Method)
And my Menifest.xml is
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.app.example.permission.C2D_MESSAGE" />
<permission
android:name="com.app.example.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.app.example" />
</intent-filter>
</receiver>
<service android:name="com.app.example.GCMIntentService" />
My BroadcastReciever Code is below
public class GCMIntentService extends GCMBaseIntentService {
@SuppressWarnings("hiding")
private static final String TAG = "GCMIntentService ";
public GCMIntentService() {
super(SENDER_ID);
}
@Override
protected void onRegistered(Context context, String registrationId) {
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putString("REGISTRATION_KEY", registrationId).commit();
}
@Override
protected void onUnregistered(Context context, String registrationId) {
// Debuger.e(TAG, "Device unregistered");
}
@Override
protected void onMessage(Context context, Intent intent) {
handleMessage(context, intent);
}
@Override
protected void onDeletedMessages(Context context, int total) {
}
@Override
public void onError(Context context, String errorId) {
}
@Override
protected boolean onRecoverableError(Context context, String errorId) {
// log message
return super.onRecoverableError(context, errorId);
}
private void handleMessage(Context context, Intent intent) {
// Do whatever you want with the message
String order_ID = intent.getStringExtra("order_id");
String status_ID = intent.getStringExtra("status_id");
String message = intent.getStringExtra("message");
if (!message.equals("")) {
if (order_ID != null && status_ID != null & !status_ID.equals("4")) {
Bundle bundle = new Bundle();
bundle.putInt("fromGetItem", 2);
mainIntent = new Intent(context.getApplicationContext(),
MainActivity.class);
mainIntent.putExtras(bundle);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
}
generateNotification(context, message, mainIntent);
}
}
private static void generateNotification(Context context, String message,
Intent notificationIntent) {
int icon = R.drawable.ic_launcher;
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);
String title = context.getString(R.string.app_name);
PendingIntent intent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
// Play default notification sound
notification.defaults |= Notification.DEFAULT_SOUND;
// Vibrate if vibrate is enabled
notification.defaults |= Notification.DEFAULT_VIBRATE;
notificationManager.notify(0, notification);
}
}
How can I fix this crash?
I think you are getting and process your messages
@Override
protected void onMessage(Context context, Intent intent) {
handleMessage(context, intent);
}
When App send request to google for registration of device I don't know very well but some times google returns message so if you are parsing your messages and Intent don't get your Bundle and it gives back null so App crash. You can try with below code may be it helps.
@Override
protected void onMessage(Context context, Intent intent) {
//Bundle[{CMD=RST_FULL, from=google.com/iid}]
Bundle bundle = intent.getExtras();
if (bundle != null) {
if (!bundle.containsKey("CMD")) {
handleMessage(context, intent);
}
}
}