【发布时间】:2022-02-04 06:36:18
【问题描述】:
问题在于这些行
seekBar1.setProgress(player.getCurrentPosition());
和
seekBar2.setProgress(player2.getCurrentPosition());
错误
Attempt to invoke virtual method 'int android.media.MediaPlayer.getCurrentPosition()' on a null object reference
另外,一个小请求,我对 handler.postDelayed 有疑问,你能检查一下这个用户问题吗?我也有同样的问题,这是该问题的 link
代码 // 完整的代码很喜欢这个
public class UpdateSeekBar1 implements Runnable {
@Override
public void run() {
currentTime1.setText(createTimerLable1(seekBar1.getProgress()));
seekBar1.setProgress(player.getCurrentPosition());
handler1.postDelayed(this, 100);
}
}
public class UpdateSeekBar2 implements Runnable {
@Override
public void run() {
currentTime2.setText(createTimerLable2(seekBar2.getProgress()));
seekBar2.setProgress(player2.getCurrentPosition());
handler2.postDelayed(this, 100);
}
}
完整代码 // 代码可能有点混乱,写得不好
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
MediaPlayer player, player2;
SeekBar seekBar1, seekBar2;
TextView currentTime1, currentTime2;
TextView totalTime1, totalTime2;
Handler handler1 = new Handler();
Handler handler2 = new Handler();
ImageView play, pause, stop, play2, pause2, stop2;
int pauseCurrentPosition, pauseCurrentPosition2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
player = MediaPlayer.create(this, R.raw.dog_howl);
player2 = MediaPlayer.create(this, R.raw.dog_bark);
seekBar1 = findViewById(R.id.seekbar1);
seekBar2 = findViewById(R.id.seekbar2);
play = findViewById(R.id.playbtn);
pause = findViewById(R.id.pausebtn);
stop = findViewById(R.id.stopbtn);
play2 = findViewById(R.id.playbtn2);
pause2 = findViewById(R.id.pausebtn2);
stop2 = findViewById(R.id.stopbtn2);
currentTime1 = findViewById(R.id.currentTime1);
currentTime2 = findViewById(R.id.currentTime2);
totalTime1 = findViewById(R.id.totalTime1);
totalTime2 = findViewById(R.id.totalTime2);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
play2.setOnClickListener(this);
pause2.setOnClickListener(this);
stop2.setOnClickListener(this);
seekBar1.setMax(player.getDuration());
seekBar2.setMax(player2.getDuration());
seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
player.seekTo(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
seekBar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
player2.seekTo(i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
String totTime1 = createTimerLable1(player.getDuration());
totalTime1.setText(totTime1);
String totTime2 = createTimerLable2(player2.getDuration());
totalTime1.setText(totTime2);
}
@SuppressLint("NonConstantResourceId")
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.playbtn:
UpdateSeekBar1 updateSeekBar1 = new UpdateSeekBar1();
handler1.post(updateSeekBar1);
if (player == null) {
player = MediaPlayer.create(getApplicationContext(), R.raw.dog_howl);
player.start();
} else if (!player.isPlaying()) {
player.seekTo(pauseCurrentPosition);
player.start();
}
break;
case R.id.pausebtn:
if (player != null) {
player.pause();
pauseCurrentPosition = player.getCurrentPosition();
}
break;
case R.id.stopbtn:
if (player != null) {
player.stop();
player = null;
}
break;
case R.id.playbtn2:
UpdateSeekBar2 updateSeekBar2 = new UpdateSeekBar2();
handler2.post(updateSeekBar2);
if (player2 == null) {
player2 = MediaPlayer.create(getApplicationContext(), R.raw.dog_bark);
player2.start();
} else if (!player2.isPlaying()) {
player2.seekTo(pauseCurrentPosition2);
player2.start();
}
break;
case R.id.pausebtn2:
if (player2 != null) {
player2.pause();
pauseCurrentPosition2 = player2.getCurrentPosition();
}
break;
case R.id.stopbtn2:
if (player2 != null) {
player2.stop();
player2 = null;
}
break;
}
}
public String createTimerLable1(int duration) {
String timerLabel = "";
int min = duration / 1000 / 60;
int sec = duration / 1000 % 60;
timerLabel += min + ":";
if (sec < 10) timerLabel += "0";
timerLabel += sec;
return timerLabel;
}
public String createTimerLable2(int duration) {
String timerLabel = "";
int min = duration / 1000 / 60;
int sec = duration / 1000 % 60;
timerLabel += min + ":";
if (sec < 10) timerLabel += "0";
timerLabel += sec;
return timerLabel;
}
public class UpdateSeekBar1 implements Runnable {
@Override
public void run() {
currentTime1.setText(createTimerLable1(seekBar1.getProgress()));
seekBar1.setProgress(player.getCurrentPosition());
handler1.postDelayed(this, 100);
}
}
public class UpdateSeekBar2 implements Runnable {
@Override
public void run() {
currentTime2.setText(createTimerLable2(seekBar2.getProgress()));
seekBar2.setProgress(player2.getCurrentPosition());
handler2.postDelayed(this, 100);
}
}
}
【问题讨论】:
-
为什么这不只是您上一个问题关闭时提供的副本?这不仅仅是一个简单的空指针吗?我也建议一次只问一个问题,
can you please check this user question too I have the same issue,不太好用 -
告诉我一件事,如果有问题已经问过,如果我也有同样的问题,我在当前问题中提到了这个问题,所以我不必写重复的问题出了什么问题用它(我是真的问)或者我只是再问一次,所以会有一个新的重复问题
-
嗯,这是一个困难的情况,如果所有现有问题都没有答案,我认为再次询问现有问题不会是一件坏事,特别是如果问题被问到很久以前(比如 5 年多),我可能不会为此投反对票,所以也许试试吧,我也没有在这里投反对票,但我同意你在这里面临的错误是空指针和 99%时间空指针以相同的方式解决。您还可以为您的问题添加赏金以引起更多关注
-
,以防万一你认为我提到的问题是我自己提出的,我也只是在关注这个问题,我没有这样做,这个问题有答案,但是用户也没有得到正确的答案,我也没有,所以我只是提到这个问题,所以至少我得到了答案
-
这个问题和我今天问的不同,我只是提到它,因为我也有同样的问题,如果你看到我今天的问题,我有这行主要错误是(至少是什么我认为是):- seekBar2.setProgress(player2.getCurrentPosition());但就在它之后,我对这一行也有问题 handler2.postDelayed(this, 100); ,这是用户提出的问题
标签: java android android-mediaplayer android-seekbar