【问题标题】:MediaPlayer - handler.getCurrentPosition()MediaPlayer - handler.getCurrentPosition()
【发布时间】: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


【解决方案1】:

输入此代码:-

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;
 UpdateSeekBar1 updateSeekBar1 = new UpdateSeekBar1();
 UpdateSeekBar2 updateSeekBar2 = new UpdateSeekBar2();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    player = MediaPlayer.create(this, R.raw.bekhayali);
    player2 = MediaPlayer.create(this, R.raw.hawabanke);
    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) {
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
                player.seekTo(seekBar.getProgress());
        }
    });
    seekBar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            player2.seekTo(seekBar.getProgress());

        }
    });
    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:

            handler1.post(updateSeekBar1);
            if (player == null) {
                player = MediaPlayer.create(getApplicationContext(), R.raw.bekhayali);
                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();
                handler1.removeCallbacks(updateSeekBar1);
                player = null;
            }
            break;
        case R.id.playbtn2:
            handler2.post(updateSeekBar2);
            if (player2 == null) {
                player2 = MediaPlayer.create(getApplicationContext(), R.raw.hawabanke);
                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();
                handler2.removeCallbacks(updateSeekBar2);
                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);
    }
}}

【讨论】:

  • 谢谢你,兄弟,这件事解决了我的另一个问题,即音频不流畅的帖子延迟,但当前的问题仍然存在,当我按下停止图像视图和错误时,应用程序崩溃是一样的“尝试在空对象引用上调用虚拟方法'int android.media.MediaPlayer.getCurrentPosition()'”
  • 删除这条线后我遇到了问题 player.seekTo(progress);从 onProgrLessChanged 我无法移动搜索栏(手动更改搜索栏位置),即使我添加它,音频问题又开始了
  • 这段代码是测试我的设备。此代码正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多