当 BroadcastReceiver 从 AlarmManager 接收广播时 MediaPlayer 循环
MediaPlayer looping when BroadcastReceiver receives broadcast from AlarmManager
在我的应用程序中,单击开始按钮会选择一个从 5 秒到 5 分钟的随机时间,并将 AlarmManager 设置为等到达到该随机时间,然后播放声音。一旦播放完声音,如果还没有按下停止按钮,AlarmManager 将再次设置为等待新的随机时间量。我的问题是,一旦时间到了,第一次声音就一次播放 15 次,所以我必须清除应用程序的缓存以使其停止。
这是按钮和 AlarmManager 的代码:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_menu_layout);
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setText("START");
startButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if (!stop)
{
setAlarm(MainMenu.this);
}//end while
}//end onClick
});//end startButton onClickListener
Button stopButton = (Button) findViewById(R.id.stopButton);
stopButton.setText("STOP");
stopButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
stop = true;
}//end onClick
});//end stopButton onClickListener
}//end onCreate
public static void setAlarm(Context passedContext)
{
Intent intentAlarm = new Intent(passedContext, AlarmReceiver.class);
AlarmManager alarmManager = (AlarmManager) passedContext.getSystemService(Context.ALARM_SERVICE);
Random random = new Random();
long time = random.nextInt(300000) + 5000; //random number from 5000 ms
//to 300000 ms (5 sec to 5 min)
Toast.makeText(passedContext, "random: " + time, Toast.LENGTH_SHORT).show();
alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(passedContext, 1,
intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
}//end setAlarm
这是 BroadcastReceiver 的代码:
public void onReceive(Context context, Intent intent)
{
MediaPlayer player = MediaPlayer.create(context, R.raw.shots);
player.start();
if (MainMenu.stop == false)
MainMenu.setAlarm(context);
}//end onReceive
我不知道为什么它总是回到代码中以启动足够的声音以在其他实例之上播放它,我真的可以使用帮助。就好像 AlarmManager 一直在广播什么的。
更新:
经过一些测试后,我注意到当应用程序打开后第一次按下开始按钮时,它只会在彼此之上播放多个声音实例。之后每次按下开始按钮时,它都会正常播放。有什么想法吗?
添加到您的接收器:
player.setLooping(false);
public void onReceive(Context context, Intent intent) {
Uri alert = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mp = MediaPlayer.create(context, alert);
mp.setVolume(10, 10);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
试试这个
在我的应用程序中,单击开始按钮会选择一个从 5 秒到 5 分钟的随机时间,并将 AlarmManager 设置为等到达到该随机时间,然后播放声音。一旦播放完声音,如果还没有按下停止按钮,AlarmManager 将再次设置为等待新的随机时间量。我的问题是,一旦时间到了,第一次声音就一次播放 15 次,所以我必须清除应用程序的缓存以使其停止。
这是按钮和 AlarmManager 的代码:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_menu_layout);
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setText("START");
startButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if (!stop)
{
setAlarm(MainMenu.this);
}//end while
}//end onClick
});//end startButton onClickListener
Button stopButton = (Button) findViewById(R.id.stopButton);
stopButton.setText("STOP");
stopButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
stop = true;
}//end onClick
});//end stopButton onClickListener
}//end onCreate
public static void setAlarm(Context passedContext)
{
Intent intentAlarm = new Intent(passedContext, AlarmReceiver.class);
AlarmManager alarmManager = (AlarmManager) passedContext.getSystemService(Context.ALARM_SERVICE);
Random random = new Random();
long time = random.nextInt(300000) + 5000; //random number from 5000 ms
//to 300000 ms (5 sec to 5 min)
Toast.makeText(passedContext, "random: " + time, Toast.LENGTH_SHORT).show();
alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(passedContext, 1,
intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
}//end setAlarm
这是 BroadcastReceiver 的代码:
public void onReceive(Context context, Intent intent)
{
MediaPlayer player = MediaPlayer.create(context, R.raw.shots);
player.start();
if (MainMenu.stop == false)
MainMenu.setAlarm(context);
}//end onReceive
我不知道为什么它总是回到代码中以启动足够的声音以在其他实例之上播放它,我真的可以使用帮助。就好像 AlarmManager 一直在广播什么的。
更新: 经过一些测试后,我注意到当应用程序打开后第一次按下开始按钮时,它只会在彼此之上播放多个声音实例。之后每次按下开始按钮时,它都会正常播放。有什么想法吗?
添加到您的接收器:
player.setLooping(false);
public void onReceive(Context context, Intent intent) {
Uri alert = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mp = MediaPlayer.create(context, alert);
mp.setVolume(10, 10);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
试试这个