完成侦听器上的Android Media Player无法按预期工作

时间:2013-03-26 00:18:28

标签: android

我有一个在后台服务中运行的媒体播放器。 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信号弱或在房子周围的不同位置)时会出现问题。如果我选​​择了一首歌,它会下载并且打得好。但是,如果我选择多首歌曲,则第一首歌曲可以播放,但不会播放更多歌曲。他们正在下载,好像我选择了一首新歌,当第一首歌停止播放下载歌曲播放列表中的下一首歌曲时,新选择的歌曲下载但不播放。我似乎无法解决为什么会发生这种情况?

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

1 个答案:

答案 0 :(得分:2)

找到答案: - )

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

如果有人能说明为什么我的原始解决方案无法正常工作,我想先了解一下我做错了什么!!!