Как можно удалить все уведомления, используя функции доступности?

Как удалить все уведомления, создаваемые приложением с помощью Accessibility, если, несмотря на сообщения в логах о том, что уведомления удалены, само уведомление, генерируемое фоновым процессом, продолжает отображаться на телефоне? 

Вот код, который используется для создания уведомления в фоновом режиме: 
```java
Notification notification = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    notification = new Notification.Builder(this, CHANNEL_ID)
            .setContentTitle("Service is running")
            .setContentText("App is performing background tasks")
            .setSmallIcon(R.drawable.ic_service_icon)
            .build();
}

startForeground(1, notification); // Запуск сервиса в переднем плане
```

Также приведён код, относящийся к обработке событий доступности: 
```java
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    // Получаем информацию о текущем окне
    AccessibilityNodeInfo nodeInfo = event.getSource();

    if (nodeInfo != null) {
        Log.i(TAG, "onAccessibilityEvent: найдено окно");
        Log.i(TAG,"ForeGround Accessibility");

        // Ищем кнопку "Разрешить" и нажимаем на нее
        performActionOnPermissionDialog(nodeInfo);

        // Вызывайте метод для удаления уведомлений
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            Log.i(TAG, "Удаляем уведомления, так как изменилось состояние окна");
            removeNotifications();
        }
    }
}
```
  • 19 октября 2024 г. 22:42
Ответы на вопрос 2
Чтобы удалить уведомления, созданные с помощью уведомлений Android (в данном случае, фоновым сервисом), нужно понимать, что `Notification` в вашем коде запускается как часть метода `startForeground()`. Когда вы используете `startForeground()`, уведомление становится постоянным, и его нельзя просто удалить через функции доступности.

Чтобы убедиться, что уведомления действительно удаляются, следуйте этим шагам:

1. **Остановите сервис**: Когда сервис останавливается, и он больше не работает в фоновом режиме, уведомление автоматически удаляется. Вы можете вызвать метод `stopForeground(true)` из вашего сервиса, чтобы остановить его:

```java
@Override
public void onDestroy() {
    super.onDestroy();
    stopForeground(true); // Удаляет уведомление
}
```

2. **Убедитесь, что используете правильный ID уведомления**: В вашем коде вы используете ID `1` для уведомления. Если вы хотите контролировать удаление определенных уведомлений, убедитесь, что используете правильный ID при вызове `stopForeground()`.

3. **Отправка уведомлений с помощью NotificationManager**: Если у вас есть другие уведомления, которые необходимо удалить, вы можете использовать `NotificationManager` для их удаления:

```java
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(1); // Удаляет уведомление с ID 1
```

4. **Проверка наличия услуг**: Убедитесь, что сервис действительно остановлен и не работает в фоновом режиме. Это можно сделать с помощью методов проверки состояния сервиса.

5. **Обработка событий доступности**: Если вы хотите использовать функции доступности для удаления уведомлений, убедитесь, что вы обрабатываете правильные события и вызываете методы, которые действительно удаляют уведомления.

### Ваш код для удаления уведомлений в `onAccessibilityEvent()`

Если вы хотите удалить уведомления в методе `onAccessibilityEvent()`, то вам нужно убедиться, что в этом месте ваш код на самом деле не только вызывает `removeNotifications()`, но и останавливает сам сервис, если это предусмотрено:

```java
private void removeNotifications() {
    Log.i(TAG, "Удаляем уведомления");
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.cancel(1); // Удаление уведомления с ID 1
}
```

Убедитесь, что вызов `removeNotifications()` происходит после проверки состояния сервиса и вызова `stopForeground(true)`.

Следуя этим шагам и учитывая логику, описанную выше, вы сможете удалить все уведомления, связанные с вашим фоновым сервисом.
Удали приложение, которое спамит. 
Так как если запретить/удалять эти уведомления "приложение выполняет фоновую работу", оно од ин фиг не сможет работать корректно
Похожие вопросы