问题:播放完就报错。报错代码(PlayerService.java:152)是:message = (String) messages.poll(); log:06-08 08:49:10.527: D/dalvikvm(22098): GC_EXTERNAL_ALLOC freed 126K, 51% free 2638K/5379K, external 2081K/2137K, paused 71ms
06-08 08:52:30.068: D/AndroidRuntime(22098): Shutting down VM
06-08 08:52:30.068: W/dalvikvm(22098): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-08 08:52:30.120: E/AndroidRuntime(22098): FATAL EXCEPTION: main
06-08 08:52:30.120: E/AndroidRuntime(22098): java.lang.NullPointerException
06-08 08:52:30.120: E/AndroidRuntime(22098): at napo.mp3player.service.PlayerService$UpdateTimeCallback.run(PlayerService.java:152)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Handler.handleCallback(Handler.java:587)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Looper.loop(Looper.java:123)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-08 08:52:30.120: E/AndroidRuntime(22098): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 08:52:30.120: E/AndroidRuntime(22098): at java.lang.reflect.Method.invoke(Method.java:507)
06-08 08:52:30.120: E/AndroidRuntime(22098): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-08 08:52:30.120: E/AndroidRuntime(22098): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-08 08:52:30.120: E/AndroidRuntime(22098): at dalvik.system.NativeStart.main(Native Method)
06-08 08:57:30.247: I/Process(22098): Sending signal. PID: 22098 SIG: 9相关代码:
public void run() {
// 计算偏移量
long offset = System.currentTimeMillis() - begin;
if (currentTimeMill == 0) {
nextTimeMill = (Long) times.poll();
message = (String) messages.poll();
}
if (offset >= nextTimeMill) {
Intent intent = new Intent();
intent.setAction(AppConstant.LRC_MESSAGE_ACTION);
intent.putExtra("lrcMessage", message);
sendBroadcast(intent);
message = (String) messages.poll();
nextTimeMill = (Long) times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
06-08 08:52:30.068: D/AndroidRuntime(22098): Shutting down VM
06-08 08:52:30.068: W/dalvikvm(22098): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-08 08:52:30.120: E/AndroidRuntime(22098): FATAL EXCEPTION: main
06-08 08:52:30.120: E/AndroidRuntime(22098): java.lang.NullPointerException
06-08 08:52:30.120: E/AndroidRuntime(22098): at napo.mp3player.service.PlayerService$UpdateTimeCallback.run(PlayerService.java:152)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Handler.handleCallback(Handler.java:587)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.os.Looper.loop(Looper.java:123)
06-08 08:52:30.120: E/AndroidRuntime(22098): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-08 08:52:30.120: E/AndroidRuntime(22098): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 08:52:30.120: E/AndroidRuntime(22098): at java.lang.reflect.Method.invoke(Method.java:507)
06-08 08:52:30.120: E/AndroidRuntime(22098): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-08 08:52:30.120: E/AndroidRuntime(22098): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-08 08:52:30.120: E/AndroidRuntime(22098): at dalvik.system.NativeStart.main(Native Method)
06-08 08:57:30.247: I/Process(22098): Sending signal. PID: 22098 SIG: 9相关代码:
public void run() {
// 计算偏移量
long offset = System.currentTimeMillis() - begin;
if (currentTimeMill == 0) {
nextTimeMill = (Long) times.poll();
message = (String) messages.poll();
}
if (offset >= nextTimeMill) {
Intent intent = new Intent();
intent.setAction(AppConstant.LRC_MESSAGE_ACTION);
intent.putExtra("lrcMessage", message);
sendBroadcast(intent);
message = (String) messages.poll();
nextTimeMill = (Long) times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
解决方案 »
- android中ANROIDmANIFEST.XML文件打不开
- 自己写了个小程序,结果BUG了.扣自己的话费钱..嗨...
- 弱弱的问下activity
- android4.0获取汉字拼音失败
- Android Activit finish 后到底是退出了啥?
- 新手问题 GridView做的菜单栏 如何实现在多个Activity跳转,菜单栏一直保持在底部
- 如何在一个控件里画图?而不是在一个Activity里画图?
- 有谁知道Android中Email程序提供的Provider有哪些?
- Android for eclipse plug in 不能下载
- 这个android按钮效果怎么实现
- ListView动态改变Item的数据与UI。出现黑一下屏幕
- 我自己编写一个andriod的程序,可以直接自己下载使用试试吗?
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Queue;import napo.lrc.LrcProcessor;
import napo.model.Mp3Info;
import napo.mp3player.AppConstant;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;public class PlayerService extends Service {
private boolean isPlaying = false;
private boolean isReleased = false;
private MediaPlayer mediaPlayer = null; private ArrayList<Queue> queues = 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; Queue times = null;
Queue messages = null; @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Info mp3Info = (Mp3Info)intent.getSerializableExtra("mp3Info");
int MSG = intent.getIntExtra("MSG", 0);
if (mp3Info != null) {
if (MSG == AppConstant.PlayerMsg.PLAY_MSG) {
play(mp3Info);
} else {
if (MSG == AppConstant.PlayerMsg.PAUSE_MSG) {
pause();
} else if (MSG == AppConstant.PlayerMsg.STOP_MSG) {
stop();
}
}
}
return super.onStartCommand(intent, flags, startId);
} private void play(Mp3Info mp3Info) {
if (!isPlaying) {
String path = getMp3Path(mp3Info);
mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
mediaPlayer.setLooping(false);
mediaPlayer.start();
prepareLrc(mp3Info.getLrcName());
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis();
isPlaying = true;
isReleased = false;
}
} public void pause() {
if(isPlaying) {
mediaPlayer.pause();
System.out.println("pause---->");
handler.removeCallbacks(updateTimeCallback);
pauseTimeMills = System.currentTimeMillis();
} else {
mediaPlayer.start();
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis() - pauseTimeMills + begin;
}
isPlaying = isPlaying ? false : true;
} public void stop() {
if (mediaPlayer != null) {
if (isPlaying) {
if (!isReleased) {
handler.removeCallbacks(updateTimeCallback);
mediaPlayer.stop();
mediaPlayer.release();
isReleased = true;
}
isPlaying = false;
}
}
} private String getMp3Path(Mp3Info mp3Info) {
String SDCardRoot = Environment.getExternalStorageDirectory()
.getAbsolutePath();
String path = SDCardRoot + File.separator + "mp3" + File.separator
+ mp3Info.getMp3Name();
return path;
} private void prepareLrc(String lrcName) {
try {
InputStream inputStream = new FileInputStream(Environment
.getExternalStorageDirectory().getAbsoluteFile()
+ File.separator + "mp3/" + lrcName);
LrcProcessor lrcProcessor = new LrcProcessor();
queues = lrcProcessor.process(inputStream);
updateTimeCallback = new UpdateTimeCallback(queues);
begin = 0;
currentTimeMill = 0;
nextTimeMill = 0;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} class UpdateTimeCallback implements Runnable { 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) {
Intent intent = new Intent();
intent.setAction(AppConstant.LRC_MESSAGE_ACTION);
intent.putExtra("lrcMessage", message);
sendBroadcast(intent);
message = (String) messages.poll();
nextTimeMill = (Long) times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
}
}
}
06-08 13:59:10.487: D/dalvikvm(335): GC_EXTERNAL_ALLOC freed 122K, 52% free 2630K/5379K, external 2081K/2137K, paused 81ms
06-08 13:59:29.867: D/dalvikvm(370): GC_EXTERNAL_ALLOC freed 123K, 52% free 2630K/5379K, external 2081K/2137K, paused 188ms
06-08 14:02:49.486: D/AndroidRuntime(370): Shutting down VM
06-08 14:02:49.486: W/dalvikvm(370): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-08 14:02:49.536: E/AndroidRuntime(370): FATAL EXCEPTION: main
06-08 14:02:49.536: E/AndroidRuntime(370): java.lang.NullPointerException
06-08 14:02:49.536: E/AndroidRuntime(370): at napo.mp3player.service.PlayerService$UpdateTimeCallback.run(PlayerService.java:148)
06-08 14:02:49.536: E/AndroidRuntime(370): at android.os.Handler.handleCallback(Handler.java:587)
06-08 14:02:49.536: E/AndroidRuntime(370): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 14:02:49.536: E/AndroidRuntime(370): at android.os.Looper.loop(Looper.java:123)
06-08 14:02:49.536: E/AndroidRuntime(370): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-08 14:02:49.536: E/AndroidRuntime(370): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 14:02:49.536: E/AndroidRuntime(370): at java.lang.reflect.Method.invoke(Method.java:507)
06-08 14:02:49.536: E/AndroidRuntime(370): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-08 14:02:49.536: E/AndroidRuntime(370): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-08 14:02:49.536: E/AndroidRuntime(370): at dalvik.system.NativeStart.main(Native Method)
06-08 14:02:53.796: I/Process(370): Sending signal. PID: 370 SIG: 9
代码:
package napo.mp3player.service;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Queue;import napo.lrc.LrcProcessor;
import napo.model.Mp3Info;
import napo.mp3player.AppConstant;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;public class PlayerService extends Service {
private boolean isPlaying = false;
private boolean isReleased = false;
private MediaPlayer mediaPlayer = null; private ArrayList<Queue> queues = 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; Queue times = null;
Queue messages = null; @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Info mp3Info = (Mp3Info)intent.getSerializableExtra("mp3Info");
int MSG = intent.getIntExtra("MSG", 0);
if (mp3Info != null) {
if (MSG == AppConstant.PlayerMsg.PLAY_MSG) {
play(mp3Info);
} else {
if (MSG == AppConstant.PlayerMsg.PAUSE_MSG) {
pause();
} else if (MSG == AppConstant.PlayerMsg.STOP_MSG) {
stop();
}
}
}
return super.onStartCommand(intent, flags, startId);
} private void play(Mp3Info mp3Info) {
if (!isPlaying) {
String path = getMp3Path(mp3Info);
mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
mediaPlayer.setLooping(false);
mediaPlayer.start();
prepareLrc(mp3Info.getLrcName());
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis();
isPlaying = true;
isReleased = false;
}
} public void pause() {
if(isPlaying) {
mediaPlayer.pause();
System.out.println("pause---->");
handler.removeCallbacks(updateTimeCallback);
pauseTimeMills = System.currentTimeMillis();
} else {
mediaPlayer.start();
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis() - pauseTimeMills + begin;
}
isPlaying = isPlaying ? false : true;
} public void stop() {
if (mediaPlayer != null) {
if (isPlaying) {
if (!isReleased) {
handler.removeCallbacks(updateTimeCallback);
mediaPlayer.stop();
mediaPlayer.release();
isReleased = true;
}
isPlaying = false;
}
}
} private String getMp3Path(Mp3Info mp3Info) {
String SDCardRoot = Environment.getExternalStorageDirectory()
.getAbsolutePath();
String path = SDCardRoot + File.separator + "mp3" + File.separator
+ mp3Info.getMp3Name();
return path;
} private void prepareLrc(String lrcName) {
try {
InputStream inputStream = new FileInputStream(Environment
.getExternalStorageDirectory().getAbsoluteFile()
+ File.separator + "mp3/" + lrcName);
LrcProcessor lrcProcessor = new LrcProcessor();
queues = lrcProcessor.process(inputStream);
updateTimeCallback = new UpdateTimeCallback(queues);
begin = 0;
currentTimeMill = 0;
nextTimeMill = 0;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} class UpdateTimeCallback implements Runnable { 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) {
Intent intent = new Intent();
intent.setAction(AppConstant.LRC_MESSAGE_ACTION);
intent.putExtra("lrcMessage", message);
sendBroadcast(intent);
message = (String) messages.poll();
nextTimeMill = (Long) times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
}
}
}谢谢啦
nextTimeMill = (Long) times.poll();
前面加一段
if(times != null)
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Queue;import napo.lrc.LrcProcessor;
import napo.model.Mp3Info;
import napo.mp3player.AppConstant;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;public class PlayerService extends Service {
private boolean isPlaying = false;
private boolean isReleased = false;
private MediaPlayer mediaPlayer = null; private ArrayList<Queue> queues = 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; Queue times = null;
Queue messages = null; @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Info mp3Info = (Mp3Info)intent.getSerializableExtra("mp3Info");
int MSG = intent.getIntExtra("MSG", 0);
if (mp3Info != null) {
if (MSG == AppConstant.PlayerMsg.PLAY_MSG) {
play(mp3Info);
} else {
if (MSG == AppConstant.PlayerMsg.PAUSE_MSG) {
pause();
} else if (MSG == AppConstant.PlayerMsg.STOP_MSG) {
stop();
}
}
}
return super.onStartCommand(intent, flags, startId);
} private void play(Mp3Info mp3Info) {
if (!isPlaying) {
String path = getMp3Path(mp3Info);
mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
mediaPlayer.setLooping(false);
mediaPlayer.start();
prepareLrc(mp3Info.getLrcName());
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis();
isPlaying = true;
isReleased = false;
}
} public void pause() {
if(isPlaying) {
mediaPlayer.pause();
System.out.println("pause---->");
handler.removeCallbacks(updateTimeCallback);
pauseTimeMills = System.currentTimeMillis();
} else {
mediaPlayer.start();
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis() - pauseTimeMills + begin;
}
isPlaying = isPlaying ? false : true;
} public void stop() {
if (mediaPlayer != null) {
if (isPlaying) {
if (!isReleased) {
handler.removeCallbacks(updateTimeCallback);
mediaPlayer.stop();
mediaPlayer.release();
isReleased = true;
}
isPlaying = false;
}
}
} private String getMp3Path(Mp3Info mp3Info) {
String SDCardRoot = Environment.getExternalStorageDirectory()
.getAbsolutePath();
String path = SDCardRoot + File.separator + "mp3" + File.separator
+ mp3Info.getMp3Name();
return path;
} private void prepareLrc(String lrcName) {
try {
InputStream inputStream = new FileInputStream(Environment
.getExternalStorageDirectory().getAbsoluteFile()
+ File.separator + "mp3/" + lrcName);
LrcProcessor lrcProcessor = new LrcProcessor();
queues = lrcProcessor.process(inputStream);
updateTimeCallback = new UpdateTimeCallback(queues);
begin = 0;
currentTimeMill = 0;
nextTimeMill = 0;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} class UpdateTimeCallback implements Runnable { public UpdateTimeCallback(ArrayList<Queue> queues) {
times = queues.get(0);
messages = queues.get(1);
} public void run() {
// 计算偏移量
long offset = System.currentTimeMillis() - begin;
if (currentTimeMill == 0) {
if(times != null)
nextTimeMill = (Long) times.poll();
message = (String) messages.poll();
}
if (offset >= nextTimeMill) {
Intent intent = new Intent();
intent.setAction(AppConstant.LRC_MESSAGE_ACTION);
intent.putExtra("lrcMessage", message);
sendBroadcast(intent);
message = (String) messages.poll();
if(times != null)
nextTimeMill = (Long) times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
}
}
}
if(times.isEmpty()== false){
nextTimeMill = (Long)times.poll();
}
这样的话就避免的空指针的问题,但是因为handler.postDelayed(updateTimeCallback, 10) 这个是一直在执行的,所以添加把最后一行改为
if(times.isEmpty()==false)
handler.postDelayed(updateTimeCallback, 10);
else
handler.removeCallbacks(updateTimeCallback);