Vaj*_*tha 7 android android-notifications android-asynctask android-securityexception notification-listener
我有一个用于监听通知的 NotificationService 类。但是,当我调用 getActiveNotifications() 时,它会抛出一个 SecurityException。是的,我在调用此方法之前已检查过权限。
我在 NotificationService 中使用 AsyncTask 来获取通知。代码如下。
private class AsyncProcessNotification extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
int notificationType = MainApplication.settingNotificationType;
MainApplication.clearNotificationItems();
if (MainApplication.settingNotificationType == Constants.KEY_NOTIFICATION_TYPE_DISABLED) {
Log.i(TAG, "Notifications disabled");
return null;
}
if (PermissionHelper.isNotificationPermissionGranted(getApplicationContext())) {
if (getActiveNotifications() == null || getActiveNotifications().length == 0) {
Log.i(TAG, "No notifications found");
return null;
}
Log.i(TAG, "Getting " + getActiveNotifications().length +" notifications");
Log.i(TAG, "Notification type " + notificationType);
for (StatusBarNotification statusBarNotification : getActiveNotifications()) {
// Process notifications
}
} else {
//
}
return null;
}
@Override
protected void onPostExecute(Void result) {
Intent notify = new Intent(Constants.ACTION_NOTIFICATION_LISTENER);
sendBroadcast(notify);
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,根据 Crashlytics,有时它会失败,if (getActiveNotifications() == null || getActiveNotifications().length == 0)有时它会失败Log.i(TAG, "Getting " + getActiveNotifications().length +" notifications");
要检查权限,我使用以下方法。
public static boolean isNotificationPermissionGranted(Context context) {
Set<String> appList = NotificationManagerCompat.getEnabledListenerPackages(context);
for (String l:appList) {
if (l.equals(context.getPackageName())) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
Fatal Exception: java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by java.lang.SecurityException: Disallowed call from unknown notification listener: android.service.notification.INotificationListener$Stub$Proxy@3e9880d
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at android.app.INotificationManager$Stub$Proxy.getActiveNotificationsFromListener(INotificationManager.java:1046)
at android.service.notification.NotificationListenerService.getActiveNotifications(NotificationListenerService.java:467)
at android.service.notification.NotificationListenerService.getActiveNotifications(NotificationListenerService.java:420)
at com.afd.app.lockscreen.ios11.lib.service.NotificationService$AsyncProcessNotification.doInBackground(NotificationService.java:120)
at com.afd.app.lockscreen.ios11.lib.service.NotificationService$AsyncProcessNotification.doInBackground(NotificationService.java:97)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)
我知道我一定在做一些愚蠢的事情,但无法弄清楚是什么。有人可以帮忙吗?谢谢!
小智 1
我在通知监听器服务中遇到了同样的错误。我可以通过在调用任何NotificationListenerService方法之前等待侦听器服务连接到通知管理器来解决此问题 。
@Override
public void onListenerConnected() {
Log.i(TAG, "Listener connected");
listenerConnected = true;
}
private class AsyncProcessNotification extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
...
// wait until our notification listener service is connected
// to the notification manager
Log.i(TAG, "Waiting for listener to be connected...");
while(!listenerConnected);
// Call getActiveNotifications after this
for (StatusBarNotification sbn : getActiveNotifications()) {
processNotifications(sbn);
}
}
// rest of the AsyncTask here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1843 次 |
| 最近记录: |