Depuis hier, j'ai un problème avec Android 4.2 lorsque je reçois des notifications Push, il nécessite l'autorisation même si je ne le configure pas pour vibrer
Notification notification = new Notification(icon, notificationItem.message, when);
notification.setLatestEventInfo(context, "App", notificationItem.message,
PendingIntent.getActivity(context, 0, intent, 0));
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;
NotificationManager nm =
(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(notificationItem.notificationID, notification);
l'exception est soulevée par nm.notify
J'ai ce problème dans deux applications différentes et je ne modifie jamais le code
Il s'agissait d'un bogue dans Android 4.2 en raison d'un changement dans la politique de vibration de notification; le bogue d'autorisation a été corrigé par ce changement dans 4.2.1.
J'ai eu la même exception dans Jelly bean 4.1.2, puis suite aux modifications que j'ai apportées pour résoudre ce problème
1. autorisation ajoutée dans le fichier manifeste.
<uses-permission
Android:name="Android.permission.VIBRATE"></uses-permission>
2. Composition de la notification couverte par Try-Catch
try
{
mNotificationManager = (NotificationManager)
this.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this)
.setSmallIcon(R.drawable.ic_notif_alert)
.setContentTitle(getResources().getString(R.string.app_name))
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg)
.setStyle(bigTextStyle)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
mBuilder.setAutoCancel(true);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
Log.d(TAG, "---- Notification Composed ----");
}
catch(SecurityException se)
{
se.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
Étant donné que ce bogue ne se produit que sur Android 4.2 et 4.3, vous pouvez l'utiliser comme solution de contournement (c'est-à-dire inclure la maxSdkVersion):
<uses-permission Android:name="Android.permission.VIBRATE" Android:maxSdkVersion="18"/>
Remarque: l'attribut maxSdkVersion n'a été ajouté qu'au niveau 19 de l'API, qui dans ce cas est heureusement exactement le minimum que nous voulons! En théorie, nous pourrions mettre n'importe quelle valeur <= 18 pour obtenir le même effet, mais ce serait désagréable.