【问题标题】:NotificationManager.notify() throwing securityException only on android 11 and 12NotificationManager.notify() 仅在 android 11 和 12 上抛出 securityException
【发布时间】:2022-06-12 17:10:51
【问题描述】:

在我的闹钟应用上,我有 180 次由 NotificationManager.notify() 引起的 java.lang.SecurityException 崩溃(影响 42 位用户)。

由于我有大约 50,000 个活跃用户,我想这只会在特定情况下发生。

这就是我初始化通知管理器的方式:

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);
}

下面是我调用通知方法的方式:

 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())

   }

我认为可能是因为我无法访问通知声音的文件,所以我使用了try&catch,并在catch中使用了这样的默认铃声:

 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());
     }

但这并没有帮助。

值得一提的是,我在清单中声明了 android.permission.READ_EXTERNAL_STORAGE 和 android.permission.WAKE_LOCK 权限。

这是完整的堆栈跟踪:

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)

知道我能做什么吗?

【问题讨论】:

  • 您可能想要编辑您的问题并为这些异常之一提供完整的堆栈跟踪。
  • 您是否向用户请求权限运行时?那些在清单中声明的​​?
  • 你是在没有音频的情况下尝试的吗,好像是在读取音频的时候出现异常。
  • @Rajesh 我应该在运行时询问可能导致崩溃的哪个权限?
  • @AagitoEx 我必须使用音频,因为这是一个闹钟应用程序。

标签: android securityexception notificationmanager android-securityexception


【解决方案1】:

到目前为止所有可用的信息。

堆栈跟踪在此处显示异常

at com.sux.alarmclocknew.AlarmManagerHelperWakeful.onReceive (AlarmManagerHelperWakeful.java:159)

您共享的代码部分似乎与 AlarmManagerHelperWakeful.java:159 中的 onReceive 处理程序无关。发生崩溃的地方。 您可以通过在此处捕获 Exception 来优雅地避免 Crash,之后我们可以继续探索以深入了解确切原因。

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多