Android音频播放器的Completion监听器未按预期工作

3

我有一个运行在后台服务中的媒体播放器。MP3文件通过TCP从我的桌面服务器发送。在调试应用程序时,歌曲被发送和接收。歌曲的选择是通过三个活动进行结构化的。 专辑列表(列表视图)活动带您进入歌曲列表(列表视图)活动。 您可以通过选中复选框并在选择后单击播放按钮来选择歌曲。 播放按钮绑定到服务,并通过TCP请求歌曲。所有歌曲都添加到手机存储中。以下是接收通过TCP发送的byte[]的方法(此处为myMediaPlayer类中的方法:

public void AddSong(byte[] toParse, String songName)
        {
            File cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),"MusicStreamCache");
            if(!cacheDir.exists())
                cacheDir.mkdirs();

            File temp = new File(cacheDir, songName);
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(temp);
                fos.write(toParse);
                fos.close();
            } catch (FileNotFoundException e) {

                e.printStackTrace();
            } catch (IOException e) {

                e.printStackTrace();
            }
            songs.add(temp);
            if(!mediaPlayer.isPlaying() && !isPaused)
            {
                MediaPlay();
            }

        }

        public void AddSong(File filein)
        {
            filein.deleteOnExit();
            songs.add(filein);
            if(!mediaPlayer.isPlaying() && !isPaused && CurrentSong == 0)
            {
                MediaPlay();
            }
        }

        public void MediaPlay()
        {
            if(!mediaPlayer.isPlaying() && CurrentSong <= songs.size())
            {
                mediaPlayer.reset();
                try{
                      @SuppressWarnings("resource")
                    FileInputStream fis = new FileInputStream(songs.get(CurrentSong));
                      mediaPlayer.setDataSource(fis.getFD());

                      mediaPlayer.prepare();
                      int length = mediaPlayer.getDuration();
                      mediaPlayer.start();
                      if(CurrentSong <= songs.size())
                      {
                           CurrentSong ++;   
                      }

                    }
                catch(Exception err)
                {
                    @SuppressWarnings("unused")
                    String error = err.getMessage();
                }

                mediaPlayer.setOnCompletionListener(completionListener);

            }
        }

        OnCompletionListener completionListener = new OnCompletionListener(){

            @Override
            public void onCompletion(MediaPlayer mp) {
                if(CurrentSong <= songs.size())
                {
                    MediaPlay();
                }

            }

         };

当我的手机连接到桌面并调试应用程序时,一切都如预期工作。我可以从专辑中添加一首歌曲,并且它会下载和播放。我可以从一个专辑中添加几首歌曲(或全部歌曲),它们将依次下载和播放。我可以从几个不同的专辑中选择歌曲,它们都将依次下载并按顺序播放,即完成监听器正常工作。
问题出现在我选择从Eclipse运行我的应用程序(不进行调试)然后从桌面分离(在WiFi信号较弱或房屋不同位置进行测试)时。如果我选择一首歌曲,它会下载并播放得很好。但是,如果我选择多首歌曲,第一首歌曲将播放得很好,但以后的歌曲将无法播放。它们正在下载,就像当我在第一首歌曲停止播放时选择了新的歌曲,已下载的歌曲列表中的下一首歌曲会播放,并且新选择的歌曲会下载但不播放。我似乎无法弄清楚为什么会这样发生?
由于我在调试时没有遇到这些问题。我想知道当它没有连接到桌面时,我的服务是否失去了焦点?或者我是否忽略了一些明显的问题?我已经为我的媒体播放器添加了部分唤醒锁,但这似乎并不能缓解问题。任何提示将不胜感激 :-)

当歌曲停止时,你是否正在重置你的媒体播放器? - Codeman
我正在on completion监听器中进行重置,这在调试时有效,但在仅运行时无效。 - Luthervd
1个回答

3
发现答案了:-)
看起来,如果有一个包含媒体播放器对象和一些自定义方法的媒体播放器类,就会阻止onCompletionListener工作(除了调试时)。为了解决这个问题,我的服务现在实现了OnCompletionListener,并且直接在服务中创建了一个Media Player对象。在完成方法中,我释放当前的媒体播放器并创建一个新的媒体播放器。它的表现如预期。
如果有人能够解释为什么我的原始解决方案不起作用,我希望更好地理解我一开始做错了什么!!!

旧的但是一个小技巧,与其发布,不如重置。 - frostymarvelous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接