Тревога не останавливается

1

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

public class MainActivity extends AppCompatActivity {
Button btn;

private Button startAlarmBtn;
private TimePickerDialog timePickerDialog;
final static int REQUEST_CODE = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     Button cancel;



            startAlarmBtn = (Button) findViewById(R.id.startAlarmBtn);
            startAlarmBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    openPickerDialog(false);
                }
            });


    cancel=(Button)findViewById(R.id.cancel);
    cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stopAlarm();
        }
    });
}
private void openPickerDialog(boolean is24hour) {

    Calendar calendar = Calendar.getInstance();

    timePickerDialog = new TimePickerDialog(
            MainActivity.this,
            onTimeSetListener,
            calendar.get(Calendar.HOUR_OF_DAY),
            calendar.get(Calendar.MINUTE),
            is24hour);
    timePickerDialog.setTitle("Alarm Ayarla");

    timePickerDialog.show();
}

TimePickerDialog.OnTimeSetListener onTimeSetListener
        = new TimePickerDialog.OnTimeSetListener(){

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        Calendar calNow = Calendar.getInstance();
        Calendar calSet = (Calendar) calNow.clone();

        calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
        calSet.set(Calendar.MINUTE, minute);
        calSet.set(Calendar.SECOND, 0);
        calSet.set(Calendar.MILLISECOND, 0);

        if(calSet.compareTo(calNow) <= 0){

            calSet.add(Calendar.DATE, 1);
        }

        setAlarm(calSet);
    }};

private void setAlarm(Calendar alarmCalender){

    Toast.makeText(getApplicationContext(),"Alarm OK!",Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), REQUEST_CODE, intent, 0);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalender.getTimeInMillis(), pendingIntent);

}
private void stopAlarm(){

    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), REQUEST_CODE,
            new Intent(getApplicationContext(), AlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    pendingIntent.cancel();


}
}


public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null)
    {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
    ringtone.play();
}


}

Как выключить будильник?
Мой другой вопрос, уместно ли иметь их в главной теме?
Должен ли я использовать AsyncTask или многопоточность?

Спасибо.

Теги:
alarmmanager
android-alarms

1 ответ

0
Лучший ответ

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

Простой подход к выбору времени, как показано ниже:

public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null)
    {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
    ringtone.play();

new CountDownTimer(30000, 1000) { // a timer for 30 seconds, that updates approximately every second
 public void onTick(long millisUntilFinished) {
  }
  public void onFinish() {
// stop your ringtone here, or do other necessary stuff here
// you might want to check if the ringtone was not stopped before this method
 }
}.start();
}
}

В ответ на ваш второй вопрос, вы также можете использовать поток с обработчиком или runnable для соответствующего управления рингтоном. AsyncTask может быть слишком много работы для чего-то относительно простого.

  • 0
    Это работает, спасибо большое. Как конвертировать кнопку, чтобы нажать Стоп.
  • 0
    Позвольте кнопке отправить широковещательную рассылку для приема классом AlarmReceiver

Ещё вопросы

Сообщество Overcoder
Наверх
Меню