Android

Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified

Таргетинг на S + (версия 31 и выше) требует указания одного из FLAG_IMMUTABLE или FLAG_MUTABLE

Приложение вылетает во время выполнения со следующей ошибкой :


java.lang.Исключение IllegalArgumentException: maa.abc: Таргетинг на S + (версия 31 и выше) требует указания одного из FLAG_IMMUTABLE или FLAG_MUTABLE при создании PendingIntent. Настоятельно рекомендуется использовать FLAG_IMMUTABLE, используйте FLAG_MUTABLE только в том случае, если какая-то функциональность зависит от изменяемого PendingIntent , например, если его нужно использовать со встроенными ответами или пузырьками. в android.app.PendingIntent.checkFlags(PendingIntent.java:375) в android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645) в android.app.PendingIntent.getBroadcast(PendingIntent.java:632) в com.google.android.exoplayer2.ui.PlayerNotificationManager.createBroadcastIntent(PlayerNotificationManager.java:1373) на <url>.google.android.exoplayer2.ui.PlayerNotificationManager. com.google.android.exoplayer2.ui.PlayerNotificationManager.createPlaybackActions(PlayerNotificationManager.java:1329) на com.google.android.exoplayer2.ui.PlayerNotificationManager.(PlayerNotificationManager.java:643) на com.google.android.exoplayer2.ui.PlayerNotificationManager.(PlayerNotificationManager.java: 529) на com.google.android.exoplayer2.ui.PlayerNotificationManager.createWithNotificationChannel(PlayerNotificationManager.java:456) на com.google.android.exoplayer2.ui.PlayerNotificationManager.createWithNotificationChannel(PlayerNotificationManager.java:417)


Я перепробовал все доступные решения, но приложение по-прежнему дает сбой на Android 12.

 @Nullable
@Override
public PendingIntent createCurrentContentIntent(@NonNull Player player) {
Intent intent = new Intent(service, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
return PendingIntent.getActivity(service, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

}
Переведено автоматически
Ответ 1

Если вы используете java или react-native, вставьте это в app / build.gradle



dependencies {
// ...
implementation 'androidx.work:work-runtime:2.7.1'
}


Если используете Kotlin, используйте это



dependencies {
// ...
implementation 'androidx.work:work-runtime-ktx:2.7.0'
}


и если кто-то все еще сталкивается с проблемой сбоя для Android 12, обязательно добавьте следующее в AndroidMenifest.xml



 <activity 
...
android:exported="true" // in most cases it is true but based on requirements it can be false also
>


// If using react-native push notifications then make sure to add into it also

<receiver
android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver" android:exported="true">

// Similarly

<service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService" android:exported="true">


Ответ 2

Проверьте и обновите версию exoplayer для зависимостей до последней

android.app.PendingIntent.getBroadcast() ранее использовался для возврата

@Nullable
@Override
private static PendingIntent createBroadcastIntent(
String action, Context context, int instanceId)
{
Intent intent = new Intent(action).setPackage(context.getPackageName());
intent.putExtra(EXTRA_INSTANCE_ID, instanceId);
return PendingIntent.getBroadcast(
context, instanceId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

Если вы внимательно следите за PendingIntent .FLAG_IMMUTABLE здесь отсутствует в приведенном выше фрагменте

Теперь он обновлен, чтобы возвращать следующее

@Nullable
@Override
private static PendingIntent createBroadcastIntent(
String action, Context context, int instanceId)
{
Intent intent = new Intent(action).setPackage(context.getPackageName());
intent.putExtra(EXTRA_INSTANCE_ID, instanceId);

int pendingFlags;
if (Util.SDK_INT >= 23) {
pendingFlags = PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE;
} else {
pendingFlags = PendingIntent.FLAG_UPDATE_CURRENT;
}

return PendingIntent.getBroadcast(context, instanceId, intent, pendingFlags);
}
Ответ 3

В моем случае для чтения тегов с использованием системы доставки переднего плана это работает..

Если вы разрешаете запуск своего приложения в Android 12, используйте следующее:

PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(this,
0, new Intent(this, getClass()).addFlags(
Intent.FLAG_ACTIVITY_SINGLE_TOP),
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
}else {
pendingIntent = PendingIntent.getActivity(this,
0, new Intent(this, getClass()).addFlags(
Intent.FLAG_ACTIVITY_SINGLE_TOP),
PendingIntent.FLAG_UPDATE_CURRENT);
}
Ответ 4

Для дальнейшего использования

добавить implementation 'androidx.work:work-runtime:2.7.1 в app/build.gradle

dependencies {
// ...
implementation 'androidx.work:work-runtime:2.7.1'
}

добавить | PendingIntent.FLAG_IMMUTABLE в строку, где вы определяете PendingIntent

 PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, configIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
2023-05-20 16:40 java android