Android 12: Notifications will no work/crash with SDK 31
See original GitHub issueBug
Environment info
react-native info
output:
System:
OS: macOS 11.3
CPU: (4) x64 Intel(R) Core(TM) i5-6267U CPU @ 2.90GHz
Memory: 48.70 MB / 8.00 GB
Shell: 5.8 - /bin/zsh
Binaries:
Node: 12.22.1 - /usr/local/bin/node
Yarn: 1.22.5 - /usr/local/bin/yarn
npm: 6.14.12 - /usr/local/bin/npm
Watchman: 2021.06.07.00 - /usr/local/bin/watchman
Managers:
CocoaPods: 1.10.1 - /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms: iOS 14.5, DriverKit 20.4, macOS 11.3, tvOS 14.5, watchOS 7.4
Android SDK:
API Levels: 28, 29, 30, 31
Build Tools: 28.0.3, 29.0.2, 29.0.3, 31.0.0
Android NDK: Not Found
IDEs:
Android Studio: 4.1 AI-201.8743.12.41.7199119
Xcode: 12.5.1/12E507 - /usr/bin/xcodebuild
Languages:
Java: 1.8.0_121 - /usr/bin/javac
Python: 2.7.15 - /Library/Frameworks/Python.framework/Versions/2.7/bin/python
npmPackages:
@react-native-community/cli: Not Found
react: 16.14.0 => 16.14.0
react-native: 0.62.2 => 0.62.2
react-native-macos: Not Found
npmGlobalPackages:
*react-native*: Not Found
Library version: 8.0.1
Steps To Reproduce
Running: PushNotification.localNotification({...})
will crash in Android 12.
Due to Android 12 changes, trying to display a local or remote notification will fail with the given error on Android 12 (when compiling with SDK 31):
2021-08-30 14:23:16.910 29950-30022/com.zinspector3.dev E/RNPushNotification: failed to send push notification
java.lang.IllegalArgumentException: com.zinspector3.dev: 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.
Reference: https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability
The fix should be as follows: https://github.com/zo0r/react-native-push-notification/blob/master/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationHelper.java#L453
- PendingIntent pendingIntent = PendingIntent.getActivity(context, notificationID, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent pendingIntent = PendingIntent.getActivity(context, notificationID, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
There are also other parts of the code that may use PendingIntent which I haven’t tested as I don’t use it, but all of these should be updated (https://github.com/zo0r/react-native-push-notification/blob/master/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationHelper.java#L531). Also, PendingIntent.FLAG_IMMUTABLE
was added in SDK 23, so a build check also needs to be performed, something like: Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_UPDATE_CURRENT
Describe what you expected to happen:
- No crash
Reproducible sample code
Please review the change and
Issue Analytics
- State:
- Created 2 years ago
- Comments:8 (2 by maintainers)
Top GitHub Comments
This fix creates this issue #2152
I think
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
(M = Android 6) should be changed toBuild.VERSION.SDK_INT > Build.VERSION_CODES.R
(R = Android 11)Just wondering, is this issue fixed?