title: java.lang.SecurityException from NotificationManager?
body: <p>We use push notifications in our game to notify users about certain in-game things when the game receives a pause/suspend call from the engine.</p>
  
  <p>I've been looking at crash logs from the Google Developer Console and a large porition of them is caused by a <code>SecurityException</code> from the use of push noticiations.</p>
  
  <p>Call stack:</p>
  
  <pre><code> java.lang.RuntimeException: 
  
    at android.app.ActivityThread.handleReceiver (ActivityThread.java:2697)
    at android.app.ActivityThread.access$1500 (ActivityThread.java:178)
    at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1466)
    at android.os.Handler.dispatchMessage (Handler.java:107)
    at android.os.Looper.loop (Looper.java:194)
    at android.app.ActivityThread.main (ActivityThread.java:5560)
    at java.lang.reflect.Method.invokeNative (Native Method)
    at java.lang.reflect.Method.invoke (Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:844)
    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:611)
    at dalvik.system.NativeStart.main (Native Method)
  
  Caused by: java.lang.SecurityException: 
    at android.os.Parcel.readException (Parcel.java:1425)
    at android.os.Parcel.readException (Parcel.java:1379)
    at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag (INotificationManager.java:239)
    at android.app.NotificationManager.notify (NotificationManager.java:132)
    at android.app.NotificationManager.notify (NotificationManager.java:108)
    at tinytitan.tinylib.NotificationPublisher.onReceive (NotificationPublisher.java:21)
    at android.app.ActivityThread.handleReceiver (ActivityThread.java:2690)
  </code></pre>
  
  <p>That 'tinytitan' line is from our Java push notif plugin. Source code:</p>
  
  <pre><code>package tinytitan.tinylib;
  
  import android.app.Notification;
  import android.app.NotificationManager;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  
  public class NotificationPublisher extends BroadcastReceiver {
  
      public static String NOTIFICATION_ID = "notification-id";
      public static String NOTIFICATION = "notification";
  
      /**
       * Called when the BroadcastReceiver is receiving an Intent
       */
      public void onReceive(Context context, Intent intent) {
          NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
          Notification notification = intent.getParcelableExtra(NOTIFICATION);
          int id = intent.getIntExtra(NOTIFICATION_ID, 0);
          notificationManager.notify(id, notification); // &lt;-- LINE# 21
      }
  }
  </code></pre>
  
  <p>Here's out manifest files (there's multiple cause we use different plugins):</p>
  
  <p><strong>Why are we getting this exception and how to fix it?</strong></p>
  
  <p><em>EDIT</em> I tried posting the Manifest files content but the formatting wouldn't let me do it, so I stripped out the angle brackets.</p>
  
  <pre><code>uses-permission android:name="android.permission.INTERNET"
  uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
  uses-permission android:name="com.android.vending.BILLING"
  uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"
  uses-permission android:name="android.permission.WAKE_LOCK"
  uses-permission android:name="android.permission.VIBRATE"
  uses-permission android:name="android.permission.GET_TASKS"
  uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  uses-permission android:name="com.android.vending.CHECK_LICENSE"
  uses-permission android:name="android.permission.android.permission.READ_PHONE_STATE"
  uses-permission android:name="android.permission.ACCESS_WIFI_STATE"
  </code></pre>
  
  <p><strong>EDIT:</strong> Rest of the plugin's code:</p>
  
  <pre><code>/**
   * Shows a Notification with a delay
   */
  public static void scheduleNotification(int id, long delayMs, String title, String message, boolean vibrate, boolean lightBlink, boolean sound, String largeImage, String smallImage)
  {
      Notification notification = getNotification(title, message, vibrate, lightBlink, sound, smallImage, largeImage);
  
      Intent notificationIntent = new Intent(UnityPlayer.currentActivity, NotificationPublisher.class);
      notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, id);
      notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
      PendingIntent pendingIntent = PendingIntent.getBroadcast(UnityPlayer.currentActivity, id, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  
      long futureInMillis = SystemClock.elapsedRealtime() + delayMs;
      AlarmManager alarmManager = (AlarmManager)UnityPlayer.currentActivity.getSystemService(Context.ALARM_SERVICE);
      alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
  }
  
  /**
   * Cancels a notification waiting to be added to the notification query or removes a notification
   * from the notification query.
   */
  public static void cancelNotification(int id)
  {
      //Remove it from the alarm manager (if present)
      AlarmManager am = (AlarmManager)UnityPlayer.currentActivity.getSystemService(Context.ALARM_SERVICE);
      Intent intent = new Intent(UnityPlayer.currentActivity, NotificationPublisher.class);
      PendingIntent pendingIntent = PendingIntent.getBroadcast(UnityPlayer.currentActivity, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      am.cancel(pendingIntent);
  
      //remove it from the notification query (if present)
      android.app.NotificationManager notificationManager = (android.app.NotificationManager)UnityPlayer.currentActivity.getSystemService(Context.NOTIFICATION_SERVICE);
      notificationManager.cancel(id);
  }
  
  /**
   * Removes all notifications that are in the notification query
   */
  public static void clearAll(){
      android.app.NotificationManager notificationManager = (android.app.NotificationManager)UnityPlayer.currentActivity.getSystemService(Context.NOTIFICATION_SERVICE);
      notificationManager.cancelAll();
  }
  </code></pre>
  
  <p>The call from C#:</p>
  
  <pre><code>    TinyAndroidServices.ScheduleNotification(id, delay, title, message, true, true, true, "app_icon", androidSmallIcon);
  </code></pre>