2013-08-31 2 views
0

В моем приложении я могу воспроизводить звуковой сигнал в указанное время с помощью таймера. Но когда я снова нажимаю кнопку установленного сигнала тревоги, он заменяет предыдущий сигнал тревоги. Может ли кто-нибудь помочь хранить несколько сигналов тревоги ... а также, пожалуйста, сообщите, где время для вызова сигнала тревоги хранится в приложении?Установка нескольких аварийных сигналов в приложении моей тревоги

Alarmreceiver.java

package com.example.alaram; 

import java.io.IOException; 

import android.app.Activity; 
import android.content.Context; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.util.Log; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Button; 




      public class AlarmReceiver extends Activity{ 
     private MediaPlayer mPlayer; 
     private WakeLock mWakeLock; 
      Button stopalarm; 

     @SuppressWarnings("deprecation") 
     public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE); 
    mWakeLock =pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "my wakelock"); 
    mWakeLock.acquire(); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
      WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN | 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
      WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

    setContentView(R.layout.alarmreceiver); 

    //Stop the alarm music 
    stopalarm=(Button) findViewById(R.id.btnStopoAlarm); 
    stopalarm.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      mPlayer.stop(); 
       finish(); 
       return; 
     } 
    }); 
    PlaySound(this,getAlarmUri()); 
} 


private void PlaySound(Context context,Uri alert){ 
    mPlayer=new MediaPlayer(); 
    try{ 
     mPlayer.setDataSource(context,alert); 
     final AudioManager am=(AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     if(am.getStreamVolume(AudioManager.STREAM_ALARM)!=0); 
     { 
      mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mPlayer.prepare(); 
      mPlayer.start(); 
     } 

    }catch(IOException e) 
    { 
    Log.i("AlaramReciever", "no audio file"); 
    } 
} 

//Get an alarm sound. If none set, try notification, Otherwise, ringtone. 
private Uri getAlarmUri() 
{ 
    Uri alert= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    if(alert==null) 
    { 
     alert= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     if(alert==null) 
     { 
      alert=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
     } 
    } 
    return alert; 
} 

protected void onStop(){ 
    super.onStop(); 
    mWakeLock.release(); 

} 

}

SetAlarm.java

package com.example.alaram; 

import java.util.Calendar; 
import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TimePicker; 
import android.widget.Toast; 

public class SetAlarm extends Activity { 

TimePicker timePicker; 
Button ok; 
int hrs,min; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.setalarm); 

//Operation of Ok button or Setting Alaram Time 
ok=(Button) findViewById(R.id.btnOk); 
ok.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     Intent intent=new Intent(SetAlarm.this,AlarmReceiver.class); 
     PendingIntent pi=PendingIntent.getActivity(SetAlarm.this, 2, intent,PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager alm=(AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     timePicker=(TimePicker) findViewById(R.id.timePicker1); 
     hrs=timePicker.getCurrentHour(); 
     min=timePicker.getCurrentMinute(); 
     Calendar calendar=Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY,hrs); 
     calendar.set(Calendar.MINUTE, min); 
     calendar.set(Calendar.SECOND, 0); 

     alm.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), pi); 
     Toast.makeText(getBaseContext(), "Alaram is Set",Toast.LENGTH_SHORT).show(); 

     finish(); 
     } 

    }); 

} 

}

ответ

3

Это потому, что вы всегда используете один и тот же Intent. Если вы хотите, чтобы было запланировано более одного аварийного сигнала, вам необходимо изменить свое намерение. Например, вы можете определить целое число id и увеличить его для каждого нового сигнала тревоги одним. Затем вы можете использовать приведенный ниже код, чтобы присвоить этому idintent.

public class AlarmReceiver extends Activity { 

    private int id = 0; 

    @Override 
    public void onClick(View v) { 

     Intent intent=new Intent(SetAlarm.this,AlarmReceiver.class); 
     intent.setData(Uri.parse("alarm:" + (id++))); 

     ... rest of your code here 
    } 

} 

Если вы хотите cancel() сигнализации, вам нужно использовать intent точно с этим id.

+0

Я новичок в Java. Можете ли вы рассказать, как увеличить id для каждой тревоги? – user2711295

+0

Добавьте в свой класс 'private int id = 0;' и добавьте 'intent.setData()', как показано в ответе. –

+0

Все еще заменяет будильник:/ – user2711295

1

Вы настройки тот же PendingIntent для обоих сигналов тревоги according to documentation он будет заменен:

Если уже есть сигнал для этого Намерения запланированного (с равенства двух фактически определяется по filterEquals (Intent)), затем он будет удален и заменен на этот.

According to the documentation два намерения являются равно база на filterEquals(Intent) которые означают:

Определить, если два намерения являются одинаковыми для целей разрешения намерения (фильтрация). То есть, если их действие, данные, тип, класс, и категории одинаковы. Это не сравнивает никаких дополнительных данных , включенных в намерения.

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

0

вы можете использовать setRepeating как этот

alm.setRepeating(type, triggerAtMillis, intervalMillis, operation); 
+0

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

Смежные вопросы