读书人

展示歌词就出错!为什么

发布时间: 2012-08-17 02:08:34 作者: rapoo

显示歌词就出错!为什么?
问题:同步播放歌词,但一点击播放就出错了。

log:

06-06 07:59:32.087: E/AndroidRuntime(1326): FATAL EXCEPTION: main
06-06 07:59:32.087: E/AndroidRuntime(1326): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
06-06 07:59:32.087: E/AndroidRuntime(1326): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
06-06 07:59:32.087: E/AndroidRuntime(1326): at java.util.ArrayList.get(ArrayList.java:311)
06-06 07:59:32.087: E/AndroidRuntime(1326): at napo.mp3player.PlayerActivity$UpdateTimeCallback.<init>(PlayerActivity.java:145)
06-06 07:59:32.087: E/AndroidRuntime(1326): at napo.mp3player.PlayerActivity.prepareLrc(PlayerActivity.java:72)
06-06 07:59:32.087: E/AndroidRuntime(1326): at napo.mp3player.PlayerActivity.access$1(PlayerActivity.java:67)
06-06 07:59:32.087: E/AndroidRuntime(1326): at napo.mp3player.PlayerActivity$BeginButtonListener.onClick(PlayerActivity.java:91)
06-06 07:59:32.087: E/AndroidRuntime(1326): at android.view.View.performClick(View.java:2485)
06-06 07:59:32.087: E/AndroidRuntime(1326): at android.view.View$PerformClick.run(View.java:9080)
06-06 07:59:32.087: E/AndroidRuntime(1326): at android.os.Handler.handleCallback(Handler.java:587)
06-06 07:59:32.087: E/AndroidRuntime(1326): at android.os.Handler.dispatchMessage(Handler.java:92)
06-06 07:59:32.087: E/AndroidRuntime(1326): at android.os.Looper.loop(Looper.java:123)
06-06 07:59:32.087: E/AndroidRuntime(1326): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-06 07:59:32.087: E/AndroidRuntime(1326): at java.lang.reflect.Method.invokeNative(Native Method)
06-06 07:59:32.087: E/AndroidRuntime(1326): at java.lang.reflect.Method.invoke(Method.java:507)
06-06 07:59:32.087: E/AndroidRuntime(1326): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-06 07:59:32.087: E/AndroidRuntime(1326): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-06 07:59:32.087: E/AndroidRuntime(1326): at dalvik.system.NativeStart.main(Native Method)
06-06 07:59:34.386: E/InputDispatcher(68): channel '406dd650 napo.mp3player/napo.mp3player.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8
06-06 07:59:34.386: E/InputDispatcher(68): channel '406dd650 napo.mp3player/napo.mp3player.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
06-06 07:59:34.636: E/InputDispatcher(68): Received spurious receive callback for unknown input channel. fd=165, events=0x8


PlayerActivity.java的代码(145行是times = queues.get(0); ):

package napo.mp3player;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.nio.channels.FileLockInterruptionException;
import java.util.ArrayList;
import java.util.Queue;

import napo.lrc.LrcProcessor;
import napo.model.Mp3Info;
import napo.mp3player.service.PlayerService;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.text.style.UpdateAppearance;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;

public class PlayerActivity extends Activity{
ImageButton beginButton = null;
ImageButton pauseButton = null;
ImageButton stopButton = null;
MediaPlayer mediaPlayer = null;

private ArrayList<Queue> queues = null;
private TextView lrcTextView = null;
private Handler handler = new Handler();
private UpdateTimeCallback updateTimeCallback = null;
private long begin = 0;
private long nextTimeMill = 0;
private long currentTimeMill = 0;


private long pauseTimeMills = 0;
private String message = null;
private boolean isPlaying = false;

private Mp3Info mp3Info = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.player);
Intent intent = getIntent();
mp3Info = (Mp3Info)intent.getSerializableExtra("mp3Info");
beginButton = (ImageButton)findViewById(R.id.begin);
pauseButton = (ImageButton)findViewById(R.id.pause);
stopButton = (ImageButton)findViewById(R.id.stop);
lrcTextView = (TextView)findViewById(R.id.lrcText);
beginButton.setOnClickListener(new BeginButtonListener());
pauseButton.setOnClickListener(new PauseButtonListener());
stopButton.setOnClickListener(new StopButtonListener());

}

/**
* 根据歌词文件的名字,来读取文件当中的信息。
* @author napo
*
*/
private void prepareLrc(String lrcName) {
try{
InputStream inputStream = new FileInputStream(Environment.getExternalStorageDirectory().getAbsoluteFile());
LrcProcessor lrcProcessor = new LrcProcessor();
queues = lrcProcessor.process(inputStream);
updateTimeCallback = new UpdateTimeCallback(queues);
begin = 0;
currentTimeMill = 0;
nextTimeMill = 0;
} catch(FileNotFoundException e) {
e.printStackTrace();
}
}


class BeginButtonListener implements OnClickListener {

public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("mo3Info", mp3Info);
intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
//读取LRC文件
prepareLrc(mp3Info.getLrcName());
//启动Service
startService(intent);
begin = System.currentTimeMillis();
//执行updateTimeCallback 延后5秒
handler.postDelayed(updateTimeCallback, 5);
isPlaying = true;
}

}

class PauseButtonListener implements OnClickListener {

public void onClick(View v) {
//首先判断是不是空值,不然会空指针异常
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);
startActivity(intent);
if(isPlaying) {
handler.removeCallbacks(updateTimeCallback);
pauseTimeMills = System.currentTimeMillis();
} else {
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis() - pauseTimeMills + begin;
}
isPlaying = isPlaying ? false : true;
}

}

class StopButtonListener implements OnClickListener {

public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("MSG", AppConstant.PlayerMsg.STOP_MSG);
startActivity(intent);
handler.removeCallbacks(updateTimeCallback);
}
}

private String getMp3Path(Mp3Info mp3Info) {
String SDCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();
String path = SDCardRoot + File.separator + "mp3" + File.separator + mp3Info.getMp3Name();
return path ;

}

class UpdateTimeCallback implements Runnable {
Queue times = null;
Queue messages = null;

public UpdateTimeCallback(ArrayList<Queue> queues) {
times = queues.get(0);
messages = queues.get(1);
}

public void run() {
// 计算偏移量

long offset = System.currentTimeMillis() - begin;
if(currentTimeMill == 0) {
nextTimeMill = (Long)times.poll();
message = (String)messages.poll();


}
if(offset >= nextTimeMill) {
lrcTextView.setText(message);
message = (String)messages.poll();
nextTimeMill = (Long)times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
}
}
}

[解决办法]
/**
* 根据歌词文件的名字,来读取文件当中的信息。
* @author napo
*
*/
private void prepareLrc(String lrcName) {
try{
InputStream inputStream = new FileInputStream(Environment.getExternalStorageDirectory().getAbsoluteFile());
LrcProcessor lrcProcessor = new LrcProcessor();
queues = lrcProcessor.process(inputStream);
updateTimeCallback = new UpdateTimeCallback(queues);
begin = 0;
currentTimeMill = 0;
nextTimeMill = 0;
} catch(FileNotFoundException e) {
e.printStackTrace();
}
}
把queues = lrcProcessor.process(inputStream);之后的queues 打出来看看,
它没有读取到任何信息,所以下标过界了
[解决办法]
06-06 07:59:32.087: E/AndroidRuntime(1326): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
06-06 07:59:32.087: E/AndroidRuntime(1326): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
06-06 07:59:32.087: E/AndroidRuntime(1326): at java.util.ArrayList.get(ArrayList.java:311)

应该是你歌词解析点地方有问题,我以前也出现过同样点问题。

[解决办法]
数组越界,PlayerActivity.java文件发上来看看
[解决办法]
可能是你lrc歌词文件的问题,
[ti:大城小爱]
[ar:王力宏]
[offset:0]
[by:我爱歌词网--http://www.5ilrc.com]
[00:00.00]www.5ilrc.com 欢迎您
[00:09.71]乌黑的发围盘成一个圈
直接下载的lrc文件如上,但是程序只能解析方括号中的时间,其他字符读取不到,所以会造成队列为空的情况。
[ti:大城小爱]
[ar:王力宏]
[offset:0]
[by:我爱歌词网--http://www.5ilrc.com]
类似这些删掉试试。

读书人网 >Android

热点推荐