我正在开发其他一些开发人员开发的媒体播放器应用程序,其中我需要显示在媒体播放器中播放的歌曲的歌词。我在项目中放置了一个srt文件,歌曲播放正常。我从以下示例创建了一个演示: https://github.com/iTech-Developer/TimedTextTest
我正在为此使用MP3文件。我认为演示使用的是MP4。
我已将此代码集成到我的代码中,如下所示(我在开始和结束处添加了注释,而且由于此方法很大,因此我从此方法中删除了一些额外的代码):
private void playSongWithMediaPLayer(final int position) {
new Handler().post(new Runnable() {
@Override
public void run() {
setSongData(position);
if (mediaPlayer != null) {
mediaPlaying = getIntent().getBooleanExtra("isAlreadyPlaying", true);
if (!mediaPlaying)
mediaPlaying = mediaPlayer.isPlaying();
}
if (CallWebService.isNetConnectionAvailable() || Constants.songsInQueue != null) {
final int duration = mediaPlayer.getDuration();
seekBar.setMax(duration);
Log.d("seekpro", "" + spro);
if (!mediaPlaying) {
if (mediaPlayer != null)
mediaPlayer.pause();
ivPlayStop.setImageDrawable(getResources().getDrawable(R.drawable.home_play_icon));
} else {
if (mediaPlayer != null) {
try{
//Code for lyrics start here
if(Constants.songsInQueue.get(intPOsSong).getTitle().toLowerCase().contains("baby")){
mediaPlayer.addTimedTextSource(getSubtitleFile(R.raw.babyftludacrislyrics), MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
int textTrackIndex = findTrackIndexFor(MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT, mediaPlayer.getTrackInfo());
if (textTrackIndex >= 0) {
Log.d("TimedText", "Inside 1");
mediaPlayer.selectTrack(textTrackIndex);
Log.d("TimedText", "Inside 2");
} else {
Log.d("TimedText", "Cannot find text track!");
}
Log.d("TimedText", "Inside 3");
mediaPlayer.setOnTimedTextListener(MusicPlayerActivity.this);
Log.d("TimedText", "Inside 4");
}
mediaPlayer.start();
Log.d("TimedText", "Inside 5 Media player started");
} catch (Exception e) {
Log.d("TimedText", "Exception occurred");
e.printStackTrace();
}
//Ends here
//mediaPlayer.start();
}
ivPlayStop.setImageDrawable(getResources().getDrawable(R.drawable.home_stop_icon));
}
mediaPlayer.seekTo(spro);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mediaPlayer != null && fromUser) {
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
if (mediaPlayer != null)
seekBar.setProgress(mediaPlayer.getCurrentPosition());
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (mediaPlayer != null)
seekBar.setProgress(mediaPlayer.getCurrentPosition());
}
});
} else {
new NoInternetConnectionDialog(MusicPlayerActivity.this) {
@Override
public void retry() {
super.retry();
playSong(intPOsSong);
}
@Override
public void cancel() {
super.cancel();
finish();
}
};
}
}
});
}
其重写方法如下:
@Override
public void onTimedText(final MediaPlayer mp, final TimedText text) {
Log.d("TimedText", "The text is " + text.toString());
if (text != null) {
Handler shandler = new Handler();
//Handler sHandler = new Handler(Looper.getMainLooper());
shandler.post(new Runnable() {
@Override
public void run() {
int seconds = mp.getCurrentPosition() / 1000;
Log.d("TimedText", "Lyrics - [" + secondsToDuration(seconds) + "] "
+ text.getText());
}
});
}
}
演示代码在我运行时工作正常。但是,当我运行我的代码时,我添加了日志,我只得到以下日志。
D / TimedText:字幕已经存在
D / TimedText:内部1
D / TimedText:内部2
D / TimedText:内部3
D / TimedText:内部4
D / TimedText:内部5 Media Player启动
从日志中可以看到,重写方法中的代码永远不会执行,因为看不到任何日志。任何人都可以指导我做错了什么,因为除了在媒体播放器上设置定时文本侦听器时传递的上下文外,代码完全符合演示要求。根据我的猜测,问题出在代码的工作过程中,媒体播放器在另一个处理程序中启动,而在重写方法中,正在创建另一个处理程序。
谢谢