当前位置: 首页 > 知识库问答 >
问题:

为什么NotificationManagerCompat::CancelAll()获取SecurityException?

仰英发
2023-03-14

使用notificationmanagercompat取消所有通知。

NotificationManagerCompat manager =  
    NotificationManagerCompat.from(ctx.getApplicationContext());
manager.cancelAll();

它得到了例外的一些时间(大多数时间工作)。

在Andoid 6上:

java.lang.SecurityException:权限拒绝:来自PID=22994,UID=10184的getCurrentUser()需要android.Permission.interact_across_users

Fatal Exception: java.lang.SecurityException: Permission Denial: getCurrentUser() from pid=22994, uid=10184 requires android.permission.INTERACT_ACROSS_USERS
   at android.os.Parcel.readException(Parcel.java:1602)
   at android.os.Parcel.readException(Parcel.java:1555)
   at android.app.INotificationManager$Stub$Proxy.cancelAllNotifications(INotificationManager.java:649)
   at android.app.NotificationManager.cancelAll(NotificationManager.java:323)
   at android.support.v4.app.NotificationManagerCompat.cancelAll(NotificationManagerCompat.java:197)

在Android 5.0、4.4.2:

ava.lang.SecurityException:权限拒绝:来自PID=5460,UID=10135,(需要UID=1000)的getIntentSender()不允许在android.os.Parcel.ReadException(parcel.java:1465)作为包android发送

Fatal Exception: java.lang.SecurityException: Permission Denial: getIntentSender() from pid=3109, uid=10153, (need uid=1000) is not allowed to send as package android
   at android.os.Parcel.readException(Parcel.java:1472)
   at android.os.Parcel.readException(Parcel.java:1426)
   at android.app.INotificationManager$Stub$Proxy.cancelAllNotifications(INotificationManager.java:271)
   at android.app.NotificationManager.cancelAll(NotificationManager.java:220)
   at android.support.v4.app.NotificationManagerCompat.cancelAll(NotificationManagerCompat.java:197)

问题:

  1. 原因可能是什么?
  2. 这里那些id是什么?是ctx.getapplicationcontext().getapplicationinfo().uid还是android.os.process.myuid()

共有2个答案

景阳平
2023-03-14

在我看来,这听起来有两种不同的可能为什么不起作用:

最可能的原因是您使用了错误的上下文来进行调用;getApplicationContext()不是100%可靠的,有时会产生奇怪的错误,因此最好避免此调用。如果从服务或activity调用CancelAll(),请使用YourClass.this而不是GetApplicationContext(),如果是从BroadcastReceiver,则使用提供的上下文变量。

如果这仍然不起作用,可能是notificationmanagercompat中的错误,请尝试使用notificationmanager重现相同的问题。解决方法是将所有通知id保存在一个列表中,然后用Manager.cancel(id)分别取消它们。这样,系统就不会试图取消任何不属于您应用程序的通知。

奚昌胤
2023-03-14

答案并没有为问题提供一个坚实的解决方案,而是试图为OP和提供赏金的@66clsjy提供一个类似问题的原因给出一个解释。

检查stacktrace

根据stacktraceSecurityException在远程进程中抛出:您的应用程序进程“Binder”对象(例如InotificationManager.StubActivityManagerProxy等)在远程Binder对象上创建一个Binder事务(MRemote.Transact())*并从该对象读取远程调用中发生异常(_Reply.ReadException())。如果有,则分析异常消息,并在进程中抛出相应的异常

分析异常消息

这两条异常消息(一条是GetIntentSender(),另一条是GetCurrentUser())非常简单--您的应用程序没有通过权限检查,换句话说,就是ActivityManagerService的代码段,这些代码应该在System_Server进程标识(UID=1000)**下调用,但实际上是在您的应用程序进程标识下调用的。

可能的原因和解决方法

它得到了例外的一些时间(大多数时间工作)。

不做假设,你得到的“一些时间”是不恰当的Android行为。使用try/catch包装问题调用似乎是一种变通方法,直到有人提出一个可靠的解决方案(如果存在的话)。

*ActivityManagerProxy.SetRequestedOrientation()和IAccessibilityManager$Stub$Proxy.SendAccessibilityEvent()
**Android.Permission.Interact_Across_Users属于签名系统保护级别

 类似资料:
  • 嗨,我不知道我做错了什么。I有一个字符串作为参数传递给my类。我必须拆分该字符串并将相应的值赋给成员变量,但它不能正常工作。 这是我的课。 我的输入=Apple$$##12.5$$##9 我犯错了-

  • 我有一个简单的方法 每当我运行代码时,我都会收到插入电影名称的第一个提示,但是一旦我按下回车键,就会调用第二个打印,给我这个消息。 该文件已写入,但我无法在文本文件中插入任何内容。我的逻辑有什么问题,我该如何解决这个问题?我在Ruby我和Ubuntu中使用irb。 编辑:看起来,由于其他用户对我的代码工作的反应,以及我自己在另一台开发机器上的测试,我的代码在这台机器上无法工作。我唯一能说的是我在使

  • 输入是一个名为Wiki micro的文本文件。txt。。。字数计算程序运行正常。。我需要的是修改它 }

  • 风格: 日志消息:10-10 13:20:01.184:E/AndroidRuntime(1417):致命异常:main 10-10 13:20:01.184:E/AndroidRuntime(1417):android。看法WindowManager$BadTokenException:无法添加窗口--android令牌。应用程序。本地活动管理器$LocalActivityRecord@411e

  • 我正试图根据OpenGL SuperBible第六版绘制一个纹理平面。但由于某些原因,我失败了。 这是我的纹理初始化代码。 这是平面对象。对象本身是绘制的,只是没有纹理。 这些是我的顶点和片段着色器。 我这样画 但我刚买了一架黑色的飞机。如果我通过在后面添加另一行来覆盖赋值,如下所示 它可以工作,也就是说,我得到了一个白色平面,所以着色器似乎工作正常。 我没有从中得到任何错误。 兼容性: 数组包含

  • 问题内容: 我们的客户抱怨说,偶尔会有我们的电话以失败。在Javadoc中没有列出这是一个合法的可能性。有人知道这里可能会发生什么吗? 问题答案: 通道操作绑定到执行该操作的线程。如果此线程被中断,则由于IO安全问题,流/通道将关闭。