Comment résoudre l'alerte "Missing PendingIntent mutability flag" dans Android ?
Le Kit de développement du système d'exploitation Android contient de nombreuses fonctionnalités, afin de permettre aux développeurs de créer les applications qu'ils souhaitent. Parmi ces fonctionnalités, la classe "PendingIntent" fait partie des plus importantes. Cette classe contient les fonctionnalités de la classe "Intent", mais en plus permet à votre application de spécifier ce qu'une autre application doit faire depuis votre code. Cette fonctionnalité permet de gérer le comportement entre les applications. On utilise cette classe lorsque par exemple une alarme sonne ou une notification arrive sur votre téléphone. Le message d'avertissement "Missing PendingIntent mutability flag" est lié à cette classe.
À partir de la version 30 du SDK (qui correspond à Android R), vous devez obligatoirement définir la mutabilité de vos objets de la classe "PendingIntent". La plupart du temps, ces objets doivent être immuables. Cela évite que les autres applications puissent les modifier quand elles sont créées. La plupart du temps, vous allez donc définir comme valeur "PendingIntent.FLAG_IMMUTABLE". Si par contre vous souhaitez que l'application puisse modifier vos objets de la classe "PendingIntent", utilisez le drapeau "PendingIntent.FLAG_UPDATE_CURRENT". Vous devez placer la directive juste après avoir créé votre objet.
val updatedPendingIntent = PendingIntent.getActivity( applicationContext, NOTIFICATION_REQUEST_CODE, votre_objet_intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT // Choisissez ici si votre objet est immuable ou non )
Si vous souhaitez élargir la compatibilité de votre application, vous devez effectuer un test avant d'appeler cette méthode. La variable "Build.VERSION.SDK_INT" contient la valeur du SDK utilisé par l'appareil qui lance l'application. Comparez-le avec la valeur "Build.VERSION_CODES.M" pour savoir si vous utilisez la version requise du SDK. Ajouter ce test permet de rendre votre application compatible avec au minimum la version 21 du SDK, car le drapeau "PendingIntent.FLAG_IMMUTABLE" est réservé à partir de la version 30 du SDK.
val drapeau = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) ? PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_UPDATE_CURRENT val updatedPendingIntent = PendingIntent.getActivity( applicationContext, NOTIFICATION_REQUEST_CODE, votre_objet_intent, drapeau )