Using NotificationManagerCompat
to cancel all notification.
NotificationManagerCompat manager =
NotificationManagerCompat.from(ctx.getApplicationContext());
manager.cancelAll();
It got exception some time (most time works).
on 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)
on 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)
Questions:
ctx.getApplicationContext().getApplicationInfo().uid
or android.os.Process.myUid()
?The answer does not provide a solid solution for the problem, it rather attempts to give an explanation of the cause both for the OP and @66CLSjY, who offered the bounty, with a similar issue.
Inspecting the stacktrace
According to the stacktrace SecurityException
is thrown in the remote process: your app process' Binder
object (e.g. INotificationManager.Stub
, ActivityManagerProxy
etc.) makes a Binder
transaction (mRemote.transact()
) * on the remote Binder
object and read from the object an exception (_reply.readException()
) occurred within the remote call(s). If any, the exception message is analyzed and a corresponding exception is thrown in your process.
Analyzing the exception message
Both the exception messages (one with getIntentSender()
and another one with getCurrentUser()
) are quite straightforward - your app didn't pass a permission check, or in other words, the code snippets of ActivityManagerService
that were supposed to be called under the system_server
process' identity (UID=1000
) **, but, in fact, were called under your app process' identity.
Possible cause and workaround
It got exception some time (most time works).
Without making an assumption, what you get "some time" is improper Android
behavior. Wrapping the problem call with try/catch
seems to be a workaround until someone suggests a solid solution (if exists).
* ActivityManagerProxy.setRequestedOrientation() and IAccessibilityManager$Stub$Proxy.sendAccessibilityEvent()
** android.permission.INTERACT_ACROSS_USERS
is of signature | system protection level
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With