0

Я сделал будильник и там я использовал тумблер, чтобы начать свою тревогу. Я хочу, как только пользователь снова нажмет на кнопку, он должен остановить будильник (кольцо). Переключение между ВКЛ и ВЫКЛ будет начато и остановлено соответственно.Как остановить воспроизведение звука, переключаясь между кнопкой переключения?

Но сейчас я могу только начать свою тревогу. На самом деле он никогда не останавливается. Если я выключаю кнопку OFF, звук воспроизводится еще быстрее, это очень странно. Как я могу остановить его? Я вставил единственную часть кода, где я предполагаю, что проблема возникает. Если вам нужно посмотреть код моего приложения, я опубликую его. [Примечание: все остальное работает отлично]

MainActivity:

package com.mycompany.alarmclock; 
//I haven't post the imported stuff here, they are in my file 
import android.support.v7.app.ActionBarActivity; 
import java.util.Calendar; 
public class MainActivity extends Activity { 

    AlarmManager alarmManager; 
    private PendingIntent pendingIntent;//an action to be performed by other/foreign application 
    private TimePicker alarmTimePicker;//In where the user set the time 
    private static MainActivity inst; 
    private TextView alarmTextView;//the area where alarm message/notification will be displayed 


    public static MainActivity instance() { 
     return inst; 
    } 

    public void onStart() { 
     super.onStart(); 
     inst = this; 
    } 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     alarmTimePicker = (TimePicker) findViewById(R.id.alarmTimePicker); 
     alarmTextView = (TextView) findViewById(R.id.alarmText); 
     ToggleButton alarmToggle = (ToggleButton) findViewById(R.id.alarmToggle); 
     alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    } 


    public void onToggleClicked(View view) { 
     if (((ToggleButton) view).isChecked()) {//if toggle button is "ON" do the alarming function 
      Log.d("MainActivity", "Alarm On"); 
      Calendar calendar = Calendar.getInstance(); 
      calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour()); 
      calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute()); 
      Intent myIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
      pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0); 
      alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 
//In this else statement I need to add the logic so that the alarm clock stops after clicking the toggle button 
     } else {//else if the toggle button is pressed again, switch off the alarm /sound 
      alarmManager.cancel(pendingIntent); 
      setAlarmText(""); 
      Log.d("MyActivity", "Alarm Off"); 
     } 

    } 

    public void setAlarmText(String alarmText) { 
     alarmTextView.setText(alarmText); 

    } 

} 

AlarmReceiver:

package com.mycompany.alarmclock; 
//I haven't posted my imported stuff here, they are on my file. 
import android.support.v4.content.WakefulBroadcastReceiver; 

import java.net.URI; 
public class AlarmReceiver extends WakefulBroadcastReceiver { 
@Override 
    public void onReceive(final Context context, Intent intent) { 
     MainActivity inst=MainActivity.instance(); 
     inst.setAlarmText("Get Up! Get up!"); 
     Uri alarmUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 

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

     //this will send a notification message 
     ComponentName comp = new ComponentName(context.getPackageName(), 
       AlarmService.class.getName()); 
     startWakefulService(context, (intent.setComponent(comp))); 
     setResultCode(Activity.RESULT_OK); 
    } 
} 
+0

Я предполагаю, что у вас есть приемник вещания, который запускает звук, когда сигнал тревоги срабатывает? Где звук остановился? –

+0

Гэри Бак, в основном я не знаю, как остановить звук. У меня есть эта строка в моем файле манифеста. В своем заявлении else я могу добавить его. и это то, что я должен узнать от вас. – Riyana

+0

У вас есть метод onReceive() в вашей деятельности, можете ли вы опубликовать его? –

ответ

2

В вашей тумблер кнопка выключения кода можно добавить следующие строки:

Uri alarmUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri); 
ringtone.stop(); 

Редактировать:

После просмотра кода это может не работать во всех случаях. Если ваша деятельность будет уничтожена, и будет запущен будильник, не будет никакой активности, чтобы остановить мелодию звонка. Даже запуская его с помощью уведомления, кнопка переключения будет находиться в неправильном состоянии. Вероятно, мелодия звонка должна быть остановлена ​​при касании уведомления.

Когда срабатывает аварийный сигнал, он вызывает AlarmReceiver, который вызывает AlarmService. Служба AlarmService создает уведомление. Он определяет намерение, которое будет вызываться при нажатии уведомления. Это ваша основная деятельность, AlarmActivity.

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
      new Intent(this, AlarmActivity.class), 0); 

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

То, что я не вижу, - это вызов completeWakefulIntent (намерение), который освободит вашу блокировку от пробуждения, но это может быть проблемой с образцом.

Редактировать

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

AlarmReceiver:

private static Ringtone mRingtone = null; 
... 
    mRingtone = RingtoneManager.getRingtone(context, alarmUri); 
    mRingtone.play(); 
... 
} 

    public static void stopRingtone() { 
     mRingtone.stop(); 
    } 

AlarmActivity:

 AlarmReceiver.stopRingtone(); 
     alarmManager.cancel(pendingIntent); 
     setAlarmText(""); 
     Log.d("MyActivity", "Alarm Off"); 
+0

Да, я прав. Я проверил и не работал. Но теперь я снова очень смущен. где нужно коснуться уведомления.На самом деле я следовал этому учебнику http://javapapers.com/android/android-alarm-clock-tutorial/#tutorial-menu, и я не вижу никакого кода, в котором остановится будильник. он просто продолжает звонить. Нужно ли мне перепроектировать приложение tmy? – Riyana

+0

Гэри Бак, я не знаю правильного слова, чтобы поблагодарить u! действительно. Я изменил ваше предложение, и он работает очень хорошо. – Riyana