Я неоднократно пытался добавить функции, которые могли бы позволить пользователям отключать будильник Android, который объявляет текущее время с помощью механизма преобразования текста в речь Android в течение десяти минут, но отменить это не удалось.
Будильник вибрирует один раз, а затем непрерывно сообщает текущее время в течение десяти минут. Теперь я хочу добавить кнопку остановки, которую можно использовать для отмены будильника при нажатии, но все мои попытки не увенчались успехом. Ниже мой код
public class AlarmReceiver extends BroadcastReceiver {
private TextToSpeech textToSpeech;
private Handler handler;
private PendingIntent pendingIntent;
private Context appContext;
private final int totalDuration = 10 * 60 * 1000; // 10 minutes
private long startTime;
private boolean isAlarmStopped = false; // Alarm stopped flag
@Override
public void onReceive(Context context, Intent intent) {
Log.d("AlarmReceiver", "onReceive() called");
appContext = context;
// Check if the alarm should be stopped
if (intent.getBooleanExtra("STOP_ALARM", false)) {
stopAnnouncements();
return; // Immediately exit to prevent further execution
}
if (isAlarmStopped) {
Log.d("AlarmReceiver", "Alarm already stopped.");
return;
}
Log.d("AlarmReceiver", "Starting alarm sequence.");
// Vibrate the device
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
if (vibrator != null) {
vibrator.vibrate(2000); // Vibrate for 2 seconds
}
// Initialize Text-to-Speech only once
if (textToSpeech == null) {
textToSpeech = new TextToSpeech(context, status -> {
if (status == TextToSpeech.SUCCESS) {
textToSpeech.setLanguage(Locale.getDefault());
startTime = System.currentTimeMillis();
startAnnouncingTime();
}
});
} else {
startAnnouncingTime();
}
}
private void startAnnouncingTime() {
handler = new Handler(Looper.getMainLooper());
Runnable timeAnnouncer = new Runnable() {
@Override
public void run() {
// Check if the alarm was stopped
if (isAlarmStopped) {
Log.d("AlarmReceiver", "Stopping announcements due to stop flag.");
return; // Exit without rescheduling
}
// Announce current time
Calendar calendar = Calendar.getInstance();
String timeText = String.format(Locale.getDefault(), "The current time is %d:%02d",
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE));
if (textToSpeech != null && !isAlarmStopped) {
String utteranceId = "TTS_Alarm"; // Use a unique identifier for announcements
textToSpeech.speak(timeText, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
}
// Reschedule if not stopped
if (!isAlarmStopped) {
handler.postDelayed(this, 5000); // Reschedule after 5 seconds
}
}
};
handler.post(timeAnnouncer);
Log.d("AlarmReceiver", "Running timeAnnouncer, isAlarmStopped: " + isAlarmStopped);
}
private void stopAnnouncements() {
Log.d("AlarmReceiver", "Stopping alarm and announcements.");
// Set the stop flag
isAlarmStopped = true;
// Stop handler tasks immediately
if (handler != null) {
handler.removeCallbacksAndMessages(null);
Log.d("AlarmReceiver", "Handler callbacks removed.");
}
// Stop TextToSpeech if initialized
if (textToSpeech != null) {
Log.d("AlarmReceiver", "Stopping TextToSpeech.");
textToSpeech.stop(); // Stops all ongoing speech
textToSpeech.shutdown(); // Full shutdown
Log.d("AlarmReceiver", "TextToSpeech successfully stopped and shutdown.");
}
textToSpeech = null; // Ensure nullification occurs here
// Stop vibration
if (appContext != null) {
Vibrator vibrator = (Vibrator) appContext.getSystemService(Context.VIBRATOR_SERVICE);
if (vibrator != null) {
vibrator.cancel();
Log.d("AlarmReceiver", "Vibration canceled.");
}
}
Log.d("AlarmReceiver", "Alarm completely stopped.");
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... it-started
Я не могу отменить будильник Android, когда он запустился ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1736504363
Anonymous
Я неоднократно пытался добавить функции, которые могли бы позволить пользователям отключать будильник Android, который объявляет текущее время с помощью механизма преобразования текста в речь Android в течение десяти минут, но отменить это не удалось.
Будильник вибрирует один раз, а затем непрерывно сообщает текущее время в течение десяти минут. Теперь я хочу добавить кнопку остановки, которую можно использовать для отмены будильника при нажатии, но все мои попытки не увенчались успехом. Ниже мой код
public class AlarmReceiver extends BroadcastReceiver {
private TextToSpeech textToSpeech;
private Handler handler;
private PendingIntent pendingIntent;
private Context appContext;
private final int totalDuration = 10 * 60 * 1000; // 10 minutes
private long startTime;
private boolean isAlarmStopped = false; // Alarm stopped flag
@Override
public void onReceive(Context context, Intent intent) {
Log.d("AlarmReceiver", "onReceive() called");
appContext = context;
// Check if the alarm should be stopped
if (intent.getBooleanExtra("STOP_ALARM", false)) {
stopAnnouncements();
return; // Immediately exit to prevent further execution
}
if (isAlarmStopped) {
Log.d("AlarmReceiver", "Alarm already stopped.");
return;
}
Log.d("AlarmReceiver", "Starting alarm sequence.");
// Vibrate the device
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
if (vibrator != null) {
vibrator.vibrate(2000); // Vibrate for 2 seconds
}
// Initialize Text-to-Speech only once
if (textToSpeech == null) {
textToSpeech = new TextToSpeech(context, status -> {
if (status == TextToSpeech.SUCCESS) {
textToSpeech.setLanguage(Locale.getDefault());
startTime = System.currentTimeMillis();
startAnnouncingTime();
}
});
} else {
startAnnouncingTime();
}
}
private void startAnnouncingTime() {
handler = new Handler(Looper.getMainLooper());
Runnable timeAnnouncer = new Runnable() {
@Override
public void run() {
// Check if the alarm was stopped
if (isAlarmStopped) {
Log.d("AlarmReceiver", "Stopping announcements due to stop flag.");
return; // Exit without rescheduling
}
// Announce current time
Calendar calendar = Calendar.getInstance();
String timeText = String.format(Locale.getDefault(), "The current time is %d:%02d",
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE));
if (textToSpeech != null && !isAlarmStopped) {
String utteranceId = "TTS_Alarm"; // Use a unique identifier for announcements
textToSpeech.speak(timeText, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
}
// Reschedule if not stopped
if (!isAlarmStopped) {
handler.postDelayed(this, 5000); // Reschedule after 5 seconds
}
}
};
handler.post(timeAnnouncer);
Log.d("AlarmReceiver", "Running timeAnnouncer, isAlarmStopped: " + isAlarmStopped);
}
private void stopAnnouncements() {
Log.d("AlarmReceiver", "Stopping alarm and announcements.");
// Set the stop flag
isAlarmStopped = true;
// Stop handler tasks immediately
if (handler != null) {
handler.removeCallbacksAndMessages(null);
Log.d("AlarmReceiver", "Handler callbacks removed.");
}
// Stop TextToSpeech if initialized
if (textToSpeech != null) {
Log.d("AlarmReceiver", "Stopping TextToSpeech.");
textToSpeech.stop(); // Stops all ongoing speech
textToSpeech.shutdown(); // Full shutdown
Log.d("AlarmReceiver", "TextToSpeech successfully stopped and shutdown.");
}
textToSpeech = null; // Ensure nullification occurs here
// Stop vibration
if (appContext != null) {
Vibrator vibrator = (Vibrator) appContext.getSystemService(Context.VIBRATOR_SERVICE);
if (vibrator != null) {
vibrator.cancel();
Log.d("AlarmReceiver", "Vibration canceled.");
}
}
Log.d("AlarmReceiver", "Alarm completely stopped.");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79345141/im-unable-to-cancel-android-alarm-clock-when-it-started[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия