3

我有一个在后台服务中运行的媒体播放器。MP3 文件是从我桌面上的服务器通过 TCP 设置的。调试应用程序时,歌曲被发送和接收。歌曲的选择由三个活动构成。专辑列表(列表视图)活动将您带到歌曲列表(列表视图)活动。您可以通过选择复选框并在选择时单击播放按钮来选择歌曲。播放按钮绑定到服务,并通过 tcp 请求歌曲。所有歌曲都添加到手机的存储空间。这是通过 tcp 接收 byte[] setn 的方法(这是 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 信号何时弱或在房子周围的不同地方)时,会出现问题。如果我选​​择一首歌曲,它会下载并播放正常。但是,如果我选择多首歌曲,第一首歌曲播放正常,但其他歌曲将无法播放。当第一首歌曲停止播放下载歌曲列表中的下一首歌曲播放并且新选择的歌曲下载但未播放时,他们正在下载好像我选择了一首新歌曲。,我似乎无法弄清楚为什么会这样?

因为我在调试时没有这些问题。我想知道我的服务在未插入桌面时是否失去焦点?还是我错过了一些明显的东西?我为我的媒体播放器添加了部分唤醒锁定,但他似乎并没有缓解问题??任何提示将不胜感激:-)

4

1 回答 1

3

找到了答案:-)

似乎拥有一个包含媒体播放器对象和一些自定义方法的媒体播放器类正在阻止 onCompletionListener 工作(调试时除外)。为了解决这个问题,我的服务现在实现了 OnCompletionListener,并且直接在服务中创建了一个媒体播放器对象。在 OnComplete 方法中,我释放当前的媒体播放器并创建一个新的。这一切都按预期工作。

如果有人能解释为什么我原来的解决方案不起作用,我想首先更好地理解我做错了什么!!!

于 2013-03-27T01:12:01.243 回答