android – 为什么NotificationManagerCompat :: cancelAll()获取SecurityException?

使用NotificationManagerCompat取消所有通知。

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

它有一些时间(大多数时间工作)。

关于Andoid 6:

java.lang.SecurityException: Permission Denial: getCurrentUser() from pid=22994, uid=10184 requires 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: Permission Denial: getIntentSender() from pid=5460, uid=10135, (need uid=1000) is not allowed to send as package android
at android.os.Parcel.readException(Parcel.java:1465)

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)

问题:

>可能是什么原因?
>这些id是什么?它是ctx.getApplicationContext()。getApplicationInfo()。uid还是android.os.Process.myUid()?

答案并没有为这个问题提供一个坚实的解决方案,而是试图用similar issue来说明提供奖金的OP和@66CLSjY的原因。

检查堆栈跟踪

根据堆栈跟踪SecurityException在远程进程中抛出:您的应用进程的Binder对象(例如INotificationManager.Stub,ActivityManagerProxy等)makes a Binder transaction(mRemote.transact())*在远程Binder对象上从对象读取异常( _reply.readException())发生在远程调用中。如果有的话,exception message is analyzed and a corresponding exception is thrown在你的过程中。

分析异常消息

两个异常消息(一个与getIntentSender()和另一个getCurrentUser())是非常简单的 – 您的应用程序没有通过权限检查,或换句话说,ActivityManagerService的代码片段应该被称为under the system_server process’ identity(UID = 1000) **,但实际上被称为under your app process’ identity

可能的原因和解决方法

It got exception some time (most time works).

没有做出假设,你得到的“一段时间”是不正确的Android行为。 Wrapping the problem call with try/catch似乎是一个解决方法,直到有人建议一个坚实的解决方案(如果存在)。

 * ActivityManagerProxy.setRequestedOrientation()IAccessibilityManager$Stub$Proxy.sendAccessibilityEvent()
 ** android.permission.INTERACT_ACROSS_USERS是signature | system protection level

http://stackoverflow.com/questions/36634008/why-notificationmanagercompatcancelall-gets-securityexception

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:android – 为什么NotificationManagerCompat :: cancelAll()获取SecurityException?