Stern Edi
Stern Edi

Reputation: 430

Push notifications on android 2.3 crashed.

I am trying to send push notifications to a phone with GCM,it works fine on a device with android 4 but when I try to send notification on android 2.3 the app crashed and I am getting this error

03-13 11:44:25.994: E/AndroidRuntime(3579): FATAL EXCEPTION: IntentService[GCMIntentService-1074787013996-1]
03-13 11:44:25.994: E/AndroidRuntime(3579): java.lang.IllegalArgumentException: contentIntent required: pkg=com.itom.vreauRCA id=0 notification=Notification(vibrate=default,sound=default,defaults=0xffffffff)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.os.Parcel.readException(Parcel.java:1251)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.os.Parcel.readException(Parcel.java:1235)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:274)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.app.NotificationManager.notify(NotificationManager.java:110)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.app.NotificationManager.notify(NotificationManager.java:90)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at com.itom.vreauRCA.GCMIntentService.generateNotification(GCMIntentService.java:71)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at com.itom.vreauRCA.GCMIntentService.onMessage(GCMIntentService.java:36)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.os.Looper.loop(Looper.java:123)
03-13 11:44:25.994: E/AndroidRuntime(3579):     at android.os.HandlerThread.run(HandlerThread.java:60)
03-13 11:44:26.374: V/GCMBroadcastReceiver(3579): onReceive: com.google.android.c2dm.intent.RECEIVE
03-13 11:44:26.374: V/GCMBroadcastReceiver(3579): GCM IntentService class: com.itom.vreauRCA.GCMIntentService
03-13 11:44:26.374: V/GCMBaseIntentService(3579): Acquiring wakelock
03-13 11:44:26.414: V/GCMBroadcastReceiver(3579): onReceive: com.google.android.c2dm.intent.RECEIVE
03-13 11:44:26.414: V/GCMBroadcastReceiver(3579): GCM IntentService class: com.itom.vreauRCA.GCMIntentService
03-13 11:44:26.414: V/GCMBaseIntentService(3579): Acquiring wakelock

this is my GCMBaseIntentService class

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.google.android.gcm.GCMBaseIntentService;

public class GCMIntentService extends GCMBaseIntentService {
    private static final String TAG = "GCMIntentService";
    PendingIntent contentIntent;

    public GCMIntentService() {
        super(GetObiecte.SENDER_ID);
    }

    @Override
    protected void onRegistered(Context context, String registrationId) {
        Log.i(TAG, "Device registered: regId = " + registrationId);
        Log.d("GCMIntentService", "in GCMIntentService");
    }

    @Override
    protected void onUnregistered(Context context, String registrationId) {
        Log.i(TAG, "Device unregistered");
    }

    @Override
    protected void onMessage(Context context, Intent intent) {
        Log.i(TAG, "Received message");
        String a = intent.getStringExtra("data");
        String b = intent.getStringExtra("data2");
        generateNotification(context, a,b);
    }

    @Override
    protected void onDeletedMessages(Context context, int total) {
        Log.i(TAG, "Received deleted messages notification");
    }

    @Override
    public void onError(Context context, String errorId) {
        Log.i(TAG, "Received error: " + errorId);
    }

    @Override
    protected boolean onRecoverableError(Context context, String errorId) {
        Log.i(TAG, "Received recoverable error: " + errorId);
        return super.onRecoverableError(context, errorId);
    }

    private void generateNotification(Context context, String message,
                                                String title) {

        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(NOTIFICATION_SERVICE);

        Notification notification = new Notification();
        notification.icon = R.drawable.ic_launcher;
        notification.tickerText = "i-Asigutare";
        notification.defaults = Notification.DEFAULT_ALL;
        notification.setLatestEventInfo(context, title, message, null);
        notificationManager.notify(0, notification);
    }
}

Upvotes: 5

Views: 1391

Answers (2)

abbath
abbath

Reputation: 2482

notification.setLatestEventInfo(context, title, message, null); instead of null you have to add an Intent, which will be started, when the user touches the notification.

From the android developer page:

contentIntent: The intent to launch when the user clicks the expanded notification. If this is an activity, it must include the FLAG_ACTIVITY_NEW_TASK flag, which requires that you take care of task management as described in the Tasks and Back Stack document.

Upvotes: 0

Serkan Arıkuşu
Serkan Arıkuşu

Reputation: 5619

The problem is about notification.setLatestEventInfo method.

This method was deprecated in API level 11 and usage of Notification.Builder is encouraged. You may also look at NotificationCompat.Builder for usage with support library.

If you still want to go with your way, you should look at the accepted answer on this question: Android - notification manager, having a notification without an intent

which clearly states using like this

notification.setLatestEventInfo(context, contentTitle, contentText, PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0));

Upvotes: 3

Related Questions