求指点,android空指针异常

午夜小学徒 2013-11-17 04:17:33
小弟是android新手,最近在学service,想做个简易的音乐播放器,能实现播放、暂停(继续)、重播、停止。
在测试时遇见空指针错误,检查了好久都还是不知道哪错了,在此贴上代码求各位大神指点。

MainActivity.java:



package ji.shaobin.misicplayer;

import java.io.File;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;


public class MainActivity extends Activity {
private EditText editText;
private Button btn_play,btn_pause,btn_restart,btn_stop;
private PlayerService.PlayerBinder binder;
private boolean pause=false;
File file;
Intent service;
private PlayerConnection conn=new PlayerConnection();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new PlayerService();
init();
}
public void init(){
editText=(EditText)this.findViewById(R.id.edit);
btn_play=(Button)this.findViewById(R.id.play);
btn_pause=(Button)this.findViewById(R.id.pause);
btn_restart=(Button)this.findViewById(R.id.restart);
btn_stop=(Button)this.findViewById(R.id.stop);
btn_play.setOnClickListener(listener);
btn_pause.setOnClickListener(listener);
btn_restart.setOnClickListener(listener);
btn_stop.setOnClickListener(listener);

service=new Intent(MainActivity.this,PlayerService.class);
String name=editText.getText().toString();
service.putExtra("name", name);
}


OnClickListener listener=new View.OnClickListener() {

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
bindService(service, conn, BIND_AUTO_CREATE);//建立服务连接
binder.player();
break;
case R.id.pause:
if(pause){
binder.pause();
btn_pause.setText("继续");
pause=false;
}else{
binder.pause();
btn_pause.setText("暂停");
pause=true;;
}
break;
case R.id.restart:
binder.restart();
break;
case R.id.stop:
binder.stop();
}

}
};
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}


private class PlayerConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder=(PlayerService.PlayerBinder) service;
}

@Override
public void onServiceDisconnected(ComponentName name) {
binder=null;
}

}
}


PlayerService.java



package ji.shaobin.misicplayer;

import java.io.File;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Binder;
import android.os.Environment;
import android.os.IBinder;
import android.widget.Toast;

public class PlayerService extends Service {
private IBinder binder=new PlayerBinder();
private String path;
private int position;
public MediaPlayer mediaPlayer=new MediaPlayer();
private File file;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String name=intent.getStringExtra("name");
file=new File(Environment.getExternalStorageDirectory(),name);
return super.onStartCommand(intent, flags, startId);

}
private void play(int position){
if(file.exists()){
path=file.getAbsolutePath();
}else{
path=null;
Toast.makeText(this, "该文件不存在SD卡中", 1).show();
}
try {
mediaPlayer.reset();//把各项参数恢复到初始状态
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();//缓冲
mediaPlayer.setOnPreparedListener(new PreparedListener(position));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public IBinder onBind(Intent arg0) {
return binder;
}
public class PlayerBinder extends Binder {
public void player(){
if(mediaPlayer!=null){
play(0);
}
}
public void pause(){
if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
position=mediaPlayer.getCurrentPosition();
mediaPlayer.pause();
}else{
mediaPlayer.start();
mediaPlayer.seekTo(position);
}
}
public void restart(){
if(mediaPlayer!=null){
mediaPlayer.start();
mediaPlayer.seekTo(0);
}
}
public void stop(){
if(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}

private final class PreparedListener implements OnPreparedListener{
private int position;
public PreparedListener(int position){
this.position=position;
}
@Override
public void onPrepared(MediaPlayer arg0) {
mediaPlayer.start();//开始播放;
if(position>0)mediaPlayer.seekTo(position);
}
}

}
...全文
353 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
computer165 2013-11-18
  • 打赏
  • 举报
回复
private PlayerService.PlayerBinder binder; 貌似有问题,你检查一下。
依然绿茶 2013-11-18
  • 打赏
  • 举报
回复
楼主,你得贴出异常打印信息啊, 要不然真没法帮你看
午夜小学徒 2013-11-18
  • 打赏
  • 举报
回复
修改后的代码在博客中,有需要的朋友请移驾小弟博客。小弟博客刚刚开通,求踩~~~~~~
午夜小学徒 2013-11-18
  • 打赏
  • 举报
回复
谢谢楼上的热心帮忙,我已把问题解决。主要的问题是:我忘了在播放按钮(play)中调用startService(intent),启动服务,导致binder对象为空。待会附上修改后的代码给大家看看,一起学习。
jiangxiaoma111 2013-11-18
  • 打赏
  • 举报
回复
那还有一个笨方法,你这个是按钮点击事件。 看一下点击哪个按钮的时候,出现了异常错误。 然后在这个case 下面查找是哪个变量值为 null。 方法可是,通过试验性的给每个变量来赋值,如果当给一个变量赋值后,不会再出现异常,则是你这个变量的赋值问题了。
午夜小学徒 2013-11-18
  • 打赏
  • 举报
回复
引用 5 楼 jiangxiaoma111 的回复:
根据你的错误信息,看这个错误是出在了MainActivity 中57行 onClick()函数中。空指针很可能是你哪个变量没有初始化,在这个函数中设个断点调试一下。看是那个变量在用到的时候,没有赋值,值为null。然后看看是不是忘了赋值。
你好,我也知道是57行有问题啊,可是我就是不知道哪里错了,并且不会用断点调试啊,用debug后也没看出哪里有问题
午夜小学徒 2013-11-18
  • 打赏
  • 举报
回复
引用 1 楼 ncepu307 的回复:
楼主,你得贴出异常打印信息啊, 要不然真没法帮你看
你好,错误信息已附上
jiangxiaoma111 2013-11-18
  • 打赏
  • 举报
回复
根据你的错误信息,看这个错误是出在了MainActivity 中57行 onClick()函数中。空指针很可能是你哪个变量没有初始化,在这个函数中设个断点调试一下。看是那个变量在用到的时候,没有赋值,值为null。然后看看是不是忘了赋值。
午夜小学徒 2013-11-18
  • 打赏
  • 举报
回复

谢谢各位。在此附上错误信息
MR__P 2013-11-18
  • 打赏
  • 举报
回复
你在做什么的时候空指针了 能否具体一点呢

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧