Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 20.10.2019
Сообщений: 57

Отправка уведомлений

18.02.2020, 19:53. Показов 1408. Ответов 1

Студворк — интернет-сервис помощи студентам
У меня есть класс (точнее фрагмент) с настройками, который содержит в себе геттер и сеттер типа boolean, который отвечает за разрешение отправлять уведомления. И есть MainActivity, которая берет геттер и по условию запускает поток, который проверяет время с тем, который указан в классе. Но проблема в том, что приложение вылетает. Но если поставить вместо settings.isCanSendNotify() - settings.canSendNotify (обращение к переменной) приложение работает, но не отправляет в определенное время уведомлление.

Фрагмент настроек
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
public class Settings extends Fragment {
    public boolean canSendNotify;
    public String timeToSend = "19:00";
    public int hour = 19;
    public int min = 0;
 
    private String APP_PREFERENCES_keyTimeNotify = "keyTimeNotify";
    private String APP_PREFERENCES_timeNotify = "timeNotify";
    public String APP_PREFERENCES = "settingApp";
 
    public SharedPreferences settings;
    public SharedPreferences.Editor editor;
 
    CheckBox notifySend;
    TextView timeSend, timeText;
 
    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.settings, container, false);
        settings = getActivity().getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE);
        notifySend = view.findViewById(R.id.canSendNotify);
        timeSend = view.findViewById(R.id.timeSend);
        timeText = view.findViewById(R.id.timeText);
        timeSend.setText(getTimeToSend());
 
        //проверка на установку разрешения отправления уведомлений
        if (settings.getBoolean(APP_PREFERENCES_keyTimeNotify, canSendNotify)) {
            notifySend.setChecked(true);
            isCheckTrue();
        } else {
            notifySend.setChecked(false);
            isCheckFalse();
        }
 
        //обработка нажатий на чекбокс
        notifySend.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    notifySend.setChecked(true);
                    setCanSendNotify(true);
                    isCheckTrue();
                } else {
                    notifySend.setChecked(false);
                    setCanSendNotify(false);
                    isCheckFalse();
                }
            }
        });
 
        //нажатие на текст с временем отправки уведомлений
        timeSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openTimePicker();
            }
        });
 
        return view;
    }
 
    //создание диалога с выбором времени
    private void openTimePicker() {
        TimePickerDialog pickerDialog = new TimePickerDialog(getActivity(), R.style.TimePickerTheme, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                String minS = null;
                hour = hourOfDay;
                min = minute;
                if (min < 10) {
                    minS = "0" + String.valueOf(min);
                } else {
                    minS = String.valueOf(min);
                }
                timeToSend = hour + ":" + minS;
                setTimeToSend(timeToSend);
                timeSend.setText(timeToSend);
                Log.i("timeSet", timeToSend);
            }
        }, hour, min, true);
        pickerDialog.show();
    }
 
    /* Разрешение отправлять уведомления */
    public boolean isCanSendNotify() {
        settings = getActivity().getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE);
        return settings.getBoolean(APP_PREFERENCES_keyTimeNotify, canSendNotify);
    }
 
    public void setCanSendNotify(boolean canSendNotify) {
        this.canSendNotify = canSendNotify;
        editor = settings.edit();
        editor.putBoolean(APP_PREFERENCES_keyTimeNotify, canSendNotify);
        editor.apply();
    }
 
    /* Время для отправки уведомления */
    public String getTimeToSend() {
        settings = getActivity().getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE);
        return settings.getString(APP_PREFERENCES_timeNotify, timeToSend);
    }
 
    public void setTimeToSend(String timeToSend) {
        this.timeToSend = timeToSend;
        editor = settings.edit();
        editor.putString(APP_PREFERENCES_timeNotify, timeToSend);
        editor.apply();
    }
 
    /* Проверка на true/false */
    private void isCheckTrue() {
        timeSend.setTextColor(getResources().getColor(R.color.colorPrimary));
        timeSend.setEnabled(true);
        timeText.setTextColor(getResources().getColor(R.color.colorBlack));
    }
 
    private void isCheckFalse() {
        timeSend.setTextColor(getResources().getColor(R.color.colorSecondary));
        timeSend.setEnabled(false);
        timeText.setTextColor(getResources().getColor(R.color.colorSecondary));
    }
}
И MainActivity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public class MainMenuActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    private DrawerLayout drawer;
    Toolbar toolbar;
    NavigationView navigationView;
    Settings settings;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_menu);
        toolbar = findViewById(R.id.toolbarMain);
        setTitle("Школьный Помощник");
        setSupportActionBar(toolbar);
        settings= new Settings();
 
        //проверка на разрешение отправлять уведомления
        if (settings.isCanSendNotify()) {
            TimetableThread thread = new TimetableThread();
            thread.start();
        }
 
        /*
          Другой код
        */
    }
 
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        /*
          Другой код
        */
    }
 
    @Override
    public void onBackPressed() {
        /*
          Другой код
        */
    }
 
    /*
    Поток для отправки уведомлений в определенное время
     */
    class TimetableThread extends Thread {
        boolean flag = true;
        String nowTime;
        String timeStr = settings.getTimeToSend();
 
        @Override
        public void run() {
            while (flag) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {}
 
                Date time = new Date();
                SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm", Locale.UK);
                nowTime = dateFormat.format(time);
 
                if (nowTime.equals(timeStr)) {
                    NotificationCompat.Builder builder =
                            new NotificationCompat.Builder(MainMenuActivity.this, "Timetable")
                                    .setSmallIcon(R.drawable.notification_icon)
                                    .setContentTitle("Напоминание")
                                    .setContentText("Тест")
                                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                                    .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
                    NotificationManagerCompat notificationManager =
                            NotificationManagerCompat.from(MainMenuActivity.this);
                    notificationManager.notify(101, builder.build());
                    flag = false;
                }
            }
        }
    }
}
Вылетает с таким логом
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arseniy.schoolhelper/com.arseniy.schoolhelper.MainMenuActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.ContextWrapper.getSharedPreferences(java.lang.String, int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.ContextWrapper.getSharedPreferences(java.lang.String, int)' on a null object reference
        at com.arseniy.schoolhelper.Settings.isCanSendNotify(Settings.java:107)
        at com.arseniy.schoolhelper.MainMenuActivity.onCreate(MainMenuActivity.java:42)
        at android.app.Activity.performCreate(Activity.java:6662)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2020, 19:53
Ответы с готовыми решениями:

Отправка Push уведомлений с сервера Java на устройство Android
Есть такой код: JSONObject data = new JSONObject(); data.put(&quot;to&quot;, device); JSONObject info = new...

Сервис уведомлений
Привет. Нужна помощь в создании уведомлений из сервиса. В приложение поступают данные с сервера get-запросом, хочу, чтобы приложение...

Сервис уведомлений
Всем доброго времени суток. Возникла такая задача: Приложение позволяет занести какую-то задачу на день на определённое время. Нужно,...

1
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
18.02.2020, 22:35
Лучший ответ Сообщение было отмечено mouse66 как решение

Решение

Фрагменты так нельзя стартовать.
https://startandroid.ru/ru/uro... aders.html
Всю логику работы с SharedPreference лучше вынести в отдельный класс-менеджер и обращаться к нему из фрагментов или активити, передавая контекст.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.02.2020, 22:35
Помогаю со студенческими работами здесь

Журнал уведомлений
Всем привет. Сейчас разбираюсь с Notifications (уведомлениями). Вроде все понятно, но есть один нюанс информацию о котором я не могу найти:...

Фоновый слушатель уведомлений
Мне нужен фоновый процесс, который будет ожидать данные с сервера и выводить Notification о их получении. Как в обычных android приложениях...

Значок в строке уведомлений
Добрый день. Подскажите как нарисовать картинку в строку уведомлений? Картинку в самой панели уведомлений я нарисовал, т.к. в...

Концепция и реализация PUSH-уведомлений
Смысл прост как дважды два: по аналогии с вибером, скайпом и другими мессенеджарами. Приложение должно висеть в памяти и в случае нового...

Вывод уведомлений без AppCompat
Здравствуйте! Какой есть способ для вывода простейших уведомлений (Notification) на Android, минуя AppCompat? (В IDE невозможно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru