Search code examples
javaandroidpush-notificationandroid-c2dm

Android Crash During Register Push Notifications


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?


Solution

  • 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);
            }
        }
    }