24

Mit können Sie alle Benachrichtigungen abbrechen.Warum NotificationManagerCompat :: cancelAll() erhält SecurityException?

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

Es hat Ausnahme einige Zeit (die meiste Zeit funktioniert).

auf Andoid 6:

java.lang.SecurityException: Permission Denial: GetCurrentUser() von pid = 22994, uid = 10184 erfordert 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: Berechtigung Ablehnung: getIntentSender() fr om pid = 5460, uid = 10135, (müssen uid = 1000) nicht als Paket android bei android.os.Parcel.readException (Parcel.java:1465) zu senden erlaubt

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) 

Fragen:

  1. Was könnte die Ursache sein?
  2. Was sind diese ID hier? Ist es ctx.getApplicationContext().getApplicationInfo().uid oder android.os.Process.myUid()?
+1

„ist es ctx.getApplicationContext(). GetApplicationInfo(). Uid oder android.os.Process.myUid() " - Für die meisten Android-Apps sollten diese identisch sein. Ihre beiden Fehler sind jedoch ziemlich seltsam. – CommonsWare

+1

Danke CommonsWare! Es ist seltsam, es verwendet nur den Kontext der App, umAlle Benachrichtigungen zu entfernen (von innerhalb der gleichen App veröffentlicht), aber Sicherheitsausnahme erhalten. Was könnte die mögliche Ursache sein? – lannyf

+0

@lannyf Unabhängig von den Ausnahmen werden Ihre Benachrichtigungen storniert oder nicht? –

Antwort

0

Für mich klingt es wie es zwei verschiedene Möglichkeiten, warum dies nicht funktioniert:

Die wahrscheinlichste Ursache ist, dass Sie den falschen Kontext verwenden den Anruf zu tätigen; getApplicationContext() ist nicht 100% zuverlässig und manchmal erzeugt seltsame Fehler, es ist immer am besten, diesen Anruf zu vermeiden. Wenn Sie cancelAll() von einem Dienst oder einer Aktivität aus anrufen, verwenden Sie YourClass.this anstelle von getApplicationContext(). Wenn es von einem BroadcastReceiver stammt, verwenden Sie die angegebene Context-Variable.

Wenn dies immer noch nicht funktioniert, könnte es ein Fehler sein in , versuchen Sie, wenn Sie das gleiche Problem mit NotificationManager reproduzieren können. Eine Problemumgehung dafür wäre, alle Ihre Notification-IDs in einer Liste zu speichern und sie dann jeweils mit manager.cancel(id) abzubrechen. Auf diese Weise versucht das System nicht, Benachrichtigungen zu stornieren, die nicht zu Ihrer App gehören.

4

Die Antwort keine feste Lösung für das Problem bieten, versucht es eher eine Erklärung für die Ursache zu geben sowohl für den OP und @66CLSjY, der die Prämie angeboten, mit einem similar issue.


die stacktrace Inspizieren

Nach dem stacktrace SecurityException wird im Remote-Prozess ausgelöst: Ihr App-Prozess Binder Objekt (zB INotificationManager.Stub, ActivityManagerProxy etc.) makes a Binder transaction (mRemote.transact()) * auf dem Fern Binder Objekt und Lesen von dem Objekt eine Ausnahme (_reply.readException()) innerhalb der Remote-Aufruf (en) aufgetreten ist.Wenn überhaupt, die exception message is analyzed and a corresponding exception is thrown in Ihrem Prozess.

Analyse der Ausnahmemeldung

Sowohl die Ausnahmemeldungen (eines mit getIntentSender() und ein weiteres mit getCurrentUser()) sind ganz einfach - Ihre Anwendung keine Berechtigungsprüfung, oder in anderen Worten, die Code-Schnipsel bestanden haben von ActivityManagerService, die under the system_server process' identity (UID=1000) heißen sollten **, aber in Wirklichkeit wurden under your app process' identity genannt.

Mögliche Ursache und Abhilfe

Es wurde Ausnahme einige Zeit (die meiste Zeit funktioniert).

Ohne eine Annahme zu machen, was Sie „einige Zeit“ erhalten ist unanständig Android Verhalten. Wrapping the problem call with try/catch scheint ein Workaround zu sein, bis jemand eine solide Lösung vorschlägt (falls vorhanden).


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

Verwandte Themen