Tan pronto como actualicé el SDK de destino a 30+ (Android R o posterior), apareció una advertencia de Missing PendingIntent mutability flag
en PendingIntent.FLAG_UPDATE_CURRENT
flag cuando quiero definir PendingIntent
.
E/AndroidRuntime: FATAL EXCEPTION: Thread-3
Process: co.danydev.myapp, PID: 11604
java.lang.IllegalArgumentException: co.danydev.myapp: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645)
at android.app.PendingIntent.getBroadcast(PendingIntent.java:632)
at com.bswen.wzreceiver.utils.AlarmUtil.scheduleAlarm(AlarmUtil.java:30)
at co.danydev.myapp.App$1.run(App.java:115)
at java.lang.Thread.run(Thread.java:920)
I/Process: Sending signal. PID: 11604 SIG: 9
Posibles soluciones
Puede establecer su PendingIntent
como:
val updatedPendingIntent = PendingIntent.getActivity(
applicationContext,
NOTIFICATION_REQUEST_CODE,
updatedIntent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT // setting the mutability flag
)
Según la documentación de android developer la cual puedes ver aquí: https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability
Si permite que su aplicación se ejecute en Android 12, hay un nuevo indicador de mutabilidad PendingIntent
. Si no desea que su PendingIntent
sea mutado, use
PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
pendingIntent = PendingIntent.getActivity(this,
0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}else {
pendingIntent = PendingIntent.getActivity(this,
0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
Si desea que su PendingIntent
sea mutado, use lo siguiente:
PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(this,
0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
}else {
pendingIntent = PendingIntent.getActivity(this,
0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
En la documentación de Google dice: Considere seriamente usar FLAG_IMMUTABLE
, solo use FLAG_MUTABLE
si alguna funcionalidad depende de qué PendingIntent
sea mutable. El cambio debe ser sencillo. Además, asegúrese de agregar la siguiente dependencia la build.
//Work Manager dependency
implementation 'androidx.work:work-runtime:2.7.1'
Tenga en cuenta que actualmente la versión de dependencia del administrador de trabajo es 2.7.1. Puede actualizar la versión a la última si lo desea.