我有一个运行在后台服务中的媒体播放器。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信号较弱或房屋不同位置进行测试)时。如果我选择一首歌曲,它会下载并播放得很好。但是,如果我选择多首歌曲,第一首歌曲将播放得很好,但以后的歌曲将无法播放。它们正在下载,就像当我在第一首歌曲停止播放时选择了新的歌曲,已下载的歌曲列表中的下一首歌曲会播放,并且新选择的歌曲会下载但不播放。我似乎无法弄清楚为什么会这样发生?
由于我在调试时没有遇到这些问题。我想知道当它没有连接到桌面时,我的服务是否失去了焦点?或者我是否忽略了一些明显的问题?我已经为我的媒体播放器添加了部分唤醒锁,但这似乎并不能缓解问题。任何提示将不胜感激 :-)