在我的应用程序中,我必须从外部存储播放歌曲。它工作正常,但有时媒体播放器在没有错误日志或警告的情况下停止。这是发生这种情况时出现的我的logcat:
04-12 11:18:31.528: D/jdwp(12465): sendBufferedRequest : len=0x39
04-12 11:18:31.541: D/jdwp(12465): sendBufferedRequest : len=0x3B
04-11 22:39:16.320: D/dalvikvm(16048): threadid=10: interp stack at 0x4bf6e000
04-11 22:39:16.326: D/jdwp(16048): sendBufferedRequest : len=0x3B
04-11 22:39:16.436: D/dalvikvm(16048): threadid=11: interp stack at 0x4bfa8000
04-11 22:39:16.436: D/dalvikvm(16048): threadid=11: calling run()
04-11 22:39:16.437: D/dalvikvm(16048): threadid=12: interp stack at 0x4bfb0000
04-11 22:39:16.437: D/dalvikvm(16048): threadid=12: calling run()
04-11 22:39:16.476: D/dalvikvm(16048): threadid=13: interp stack at 0x4bfb8000
04-11 22:39:16.476: D/dalvikvm(16048): threadid=13: calling run()
04-11 22:39:16.486: D/dalvikvm(16048): threadid=13: exiting
04-11 23:42:26.737: D/dalvikvm(3500): threadid=13: bye!
04-11 23:42:26.737: D/dalvikvm(3500): threadid=0: freeing
04-11 23:42:26.753: D/ACRA(3500): Using default Report Fields
04-11 23:42:26.765: D/ACRA(3500): Looking for error files in /data/data/com.pakagename/files
我正在尝试media.setdatasource(file.getFD)
某些主题的建议,但它不起作用我需要你的帮助,谢谢
这是我创建媒体播放器时的代码:
try {
try {
Log.d("file music ", musicObject.getFilePath());
FileInputStream fileInputStream = new FileInputStream(musicObject.getFilePath());
mediaPlayer.setDataSource(fileInputStream.getFD());
} catch (IOException e1) {
e1.printStackTrace();
}
mediaPlayer.playlistEntry = musicObject;
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.e("",
"onCompletion getPlaylistPlaybackMode "
+ mPlaylist.getPlaylistPlaybackMode()
+ " seleected track id "
+ mPlaylist.getSelectedIndex());
mMPHandler.sendEmptyMessageDelayed(MSG_MP_RELEASE, 500);
}
});
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.preparing = false;
// we may start playing
if (mPlaylist.getSelectedTrack() == mediaPlayer.playlistEntry
&& mediaPlayer.playAfterPrepare) {
mediaPlayer.playAfterPrepare = false;
play();
Log.d("onprepared", "true");
}
}
});
mediaPlayer
.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp,
int percent) {
if (mPlayerEngineListener != null) {
mPlayerEngineListener.onTrackBuffering(percent);
}
}
});
mediaPlayer.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.w(UILApplication.TAG, "PlayerEngineImpl fail, what ("
+ what + ") extra (" + extra + ")");
CommonUtils.writetoFile( "PlayerEngineImpl fail, what ("
+ what + ") extra (" + extra + ")", context);
if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) {
if (mPlayerEngineListener != null) {
mPlayerEngineListener.onTrackStreamError();
}
stop();
return true;
}
if (what == -1) {
long failTime = System.currentTimeMillis();
if (failTime - mLastFailTime > FAIL_TIME_FRAME) {
mTimesFailed = 1;
mLastFailTime = failTime;
Log.w(UILApplication.TAG, "PlayerEngineImpl "
+ mTimesFailed
+ " fail within FAIL_TIME_FRAME");
} else {
mTimesFailed++;
if (mTimesFailed > ACCEPTABLE_FAIL_NUMBER) {
Log.w(UILApplication.TAG,
"PlayerEngineImpl too many fails, aborting playback");
if (mPlayerEngineListener != null) {
mPlayerEngineListener.onTrackStreamError();
}
stop();
return true;
}
}
}
return false;
}
});
mediaPlayer.preparing = true;
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
if (mPlayerEngineListener != null) {
mPlayerEngineListener.onTrackChanged(mPlaylist
.getSelectedTrack());
}
return mediaPlayer;
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
玩的时候:
if (mCurrentMediaPlayer != null
&& mCurrentMediaPlayer.musicObject != mPlaylist
.getSelected()) {
try {
mCurrentMediaPlayer.stop();
} catch (IllegalStateException e) {
// this may happen sometimes
} finally {
mCurrentMediaPlayer.release();
mCurrentMediaPlayer = null;
}
mCurrentMediaPlayer = build(mPlaylist.getSelectedTrack());
}
和汉德勒在oncompletionListener
:
protected Handler mMPHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == MSG_MP_RELEASE) {
if (mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.SHUFFLE_AND_REPEAT1
|| mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.REPEAT1) {
Log.e("",
"onCompletion getPlaylistPlaybackMode "
+ mPlaylist.getPlaylistPlaybackMode()
+ " seleected track id "
+ mPlaylist.getSelectedIndex());
play(mPlaylist.getSelectedIndex());
} else if (!mPlaylist.isLastTrackOnList()
|| mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.REPEAT
|| mPlaylist.getPlaylistPlaybackMode() == PlaylistPlaybackMode.SHUFFLE_AND_REPEAT) {
next();
} else
{
stop();
}
}
}
};
编辑:直到现在,我不知道会发生什么。当我在应用程序外执行一些或很多后台操作时会出现
04-12 11:18:31.528: D/jdwp(12465): sendBufferedRequest : len=0x39
04-12 11:18:31.541: D/jdwp(12465): sendBufferedRequest : len=0x3B
也许是问题
编辑:我从 android 开发者网页中找到了一些信息:
Android 系统仅在内存不足时才会强制停止服务,并且必须为具有用户焦点的活动恢复系统资源。如果服务绑定到具有用户焦点的活动,则它不太可能被杀死,如果服务被声明在前台运行(稍后讨论),那么它几乎永远不会被杀死。否则,如果服务已启动并且长时间运行,那么系统将随着时间的推移降低其在后台任务列表中的位置,并且该服务将变得非常容易被杀死 - 如果您的服务已启动,那么您必须将其设计为优雅地处理系统重新启动。如果系统终止了您的服务,它会在资源再次可用时立即重新启动它(尽管这也取决于您从 onStartCommand() 返回的值,稍后讨论)。有关系统何时可能破坏服务的更多信息,请参阅进程和线程文档。
我怎么修不了?