从定时器启动 MediaPlayer

Starting MediaPlayer from Timer

我正在开发电池警报应用程序。我想使用 media-player 每隔一分钟使用 Timer 播放音乐,并且还想在一分钟内重复播放音乐 2 次。

Timer 调用 *8playAlarm() 方法** 时第一次工作正常,但一分钟后 Timer 再次调用调用 playAlarm() 方法 它只播放一次音乐。


     @Override
        public void onCreate() {
            super.onCreate();

            mStartTime=preferencesAlert.getInt("alert",0);  // 0 == immediately
            mInterval=preferencesInterval.getInt("interval",1);  // 1==1 minute

            mSongUri=preferencesSongUri.getString("uri","android.resource://"+getPackageName()+"/raw/celesta");

            timer = new Timer();
            TimerTask hourlyTask = new TimerTask() {
                @Override
                public void run () {
                    playAlarm();
                }
            };
            // schedule the task to run starting now and then every time interval...
            timer.schedule (hourlyTask,60000*mStartTime, 60000*mInterval);

    }

playAlarm() 方法


     private void playAlarm(){

            playerAlarm=MediaPlayer.create(getApplicationContext(),Uri.parse(mSongUri));
            playerAlarm.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {

                    repeatMax=preferencesRepeat.getInt("repeat",2);

                    if(repeatMin<=repeatMax){
                        repeatMin++;

                        if(playerAlarm!=null && !playerAlarm.isPlaying()) {
                            mp.seekTo(0);
                            mp.start();
                        }
                    }else {
                        mp.reset();
                        mp.release();
                    }
                }
            });
            playerAlarm.start();
        }

我想每分钟播放两次音乐,但它只播放一次

我猜是因为您正在执行仅调用一次的 onCreate 方法。也许您可以在某些后台服务中创建它并每分钟调用一次

第一次成功是因为你的 repeatMin 仍然是它的第一个值,但是在你没有在你的代码中再次将它设置为 0 之后

repeatMin = first int value; // you have to reinitialize your repeatMin somewhere when the sound 
                 has been played for the second time