On my alarm clock app, I have 180 crashes (impacted 42 users) of java.lang.SecurityException caused by NotificationManager.notify().
Since I have around 50K active users I guess it happens only under specific circumstances.
This is how I init my notification manager:
NotificationManager mgr = (NotificationManager)
context.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
// If there is a notification shown that might block the alarm, cancel it.
if (mgr != null) {
mgr.cancel(NOTIFY_ID);
}
And here's how I call the notify method:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // This is at least android 10...
if (mgr.getNotificationChannel(CHANNEL_WHATEVER) == null) {
NotificationChannel notificationChannel = new
NotificationChannel(CHANNEL_WHATEVER,
context.getString(R.string.alarms_channel_name),
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setSound(mAlarm.getAlarmTone(), new
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
mgr.createNotificationChannel(notificationChannel);
}
AudioManager audioManager = (AudioManager)
context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM,
audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM),
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
mgr.notify(NOTIFY_ID, buildNormal(context, i, pref).build())
}
I thought that it might be because I can't access the file of the notification sound, so I used try & catch, and in the catch to use the default ringtone like that:
try {
mgr.notify(NOTIFY_ID, buildNormal(context, i, pref).build());
} catch (Exception e) {
mgr.getNotificationChannel(CHANNEL_WHATEVER)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE),
new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
mgr.notify(NOTIFY_ID, buildNormal(context, i, pref).build());
}
But it didn't help.
It is also worth mentioning that I'm declaring the android.permission.READ_EXTERNAL_STORAGE and android.permission.WAKE_LOCK permissions, in the manifest.
Here's the full stacktrace:
java.lang.RuntimeException:
at android.app.ActivityThread.handleReceiver (ActivityThread.java:4483)
at android.app.ActivityThread.access$1900 (ActivityThread.java:254)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2195)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loopOnce (Looper.java:233)
at android.os.Looper.loop (Looper.java:344)
at android.app.ActivityThread.main (ActivityThread.java:8210)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:584)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1034)
Caused by: java.lang.SecurityException:
at android.os.Parcel.createExceptionOrNull (Parcel.java:2441)
at android.os.Parcel.createException (Parcel.java:2425)
at android.os.Parcel.readException (Parcel.java:2408)
at android.os.Parcel.readException (Parcel.java:2350)
at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag (INotificationManager.java:3381)
at android.app.NotificationManager.notifyAsUser (NotificationManager.java:677)
at android.app.NotificationManager.notify (NotificationManager.java:627)
at android.app.NotificationManager.notify (NotificationManager.java:603)
at com.sux.alarmclocknew.AlarmManagerHelperWakeful.onReceive (AlarmManagerHelperWakeful.java:159)
at android.app.ActivityThread.handleReceiver (ActivityThread.java:4467)
Caused by: android.os.RemoteException:
at com.android.server.uri.UriGrantsManagerService.checkGrantUriPermissionUnlocked (UriGrantsManagerService.java:1311)
at com.android.server.uri.UriGrantsManagerService.checkGrantUriPermissionUnlocked (UriGrantsManagerService.java:1325)
at com.android.server.uri.UriGrantsManagerService.access$900 (UriGrantsManagerService.java:116)
at com.android.server.uri.UriGrantsManagerService$LocalService.checkGrantUriPermission (UriGrantsManagerService.java:1477)
at com.android.server.notification.NotificationRecord.visitGrantableUri (NotificationRecord.java:1501)
Any idea what can I do?
with whatever information is available till this point.
Stack trace shows an Exception here
if the following is the related code part Then ensure that Exception does not occur within the Exception handler itself. (That I cannot conclude with the given info). The statement you are catching is being used again in the Exception handler block.
There is bit too much code in the Exception block anyway.