web-dev-qa-db-fra.com

java.lang.SecurityException: nécessite l'autorisation VIBRATE sur Jelly bean 4.2

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

34
Ste

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.

25
dsandler

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();
    }
41
swiftBoy

É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.

30
Mark