Android студент задает вопросы о поисковой панели, примененной к MediaPlayer, но поисковая панель не двигается - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу использовать медиаплеер и панель поиска, чтобы сделать плеер, он может запускать, приостанавливать, останавливать, поворачивать назад и пропускать, также мы можем потянуть панель поиска, чтобы изменить медиаплеер. Другие функции в порядке, медиаплеер может воспроизводиться, но панель поиска не Возможно, это потому, что прогресс не изменился. Я искренне надеюсь, что вы можете помочь мне решить эту проблему. спасибо за вашу помощь

package com.example.user.lab2_leemingchak;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.SeekBar;

public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener,
        MediaPlayer.OnCompletionListener {
    private MediaPlayer mediaplayer;
    private SeekBar seekbar;
    private Runnable runnable;
    private Handler handble;
    private int i;
    ImageButton playbtn, stopbtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//initialize button UIs
        playbtn = (ImageButton) findViewById(R.id.playBtn);
        stopbtn = (ImageButton) findViewById(R.id.stopBtn);
        seekbar = (SeekBar) findViewById(R.id.seekBar);
//convert String url to Uri format using .parse()
        Uri path = Uri.parse("android.resource://" + //set the music file in res/raw as default
                getPackageName() + "/" + R.raw.enm);
//disable the Play and Stop buttons using .setEnabled()
        playbtn.setEnabled(false);
        stopbtn.setEnabled(false);
//new a MediaPlayer object
        mediaplayer = new MediaPlayer();
//set OnPreparedListener() and OnCompletionListener() to the MediaPlayer object
        mediaplayer.setOnPreparedListener(this);
        mediaplayer.setOnCompletionListener(this);
        seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                i = progress;
                if (fromUser) {
                    mediaplayer.seekTo(progress);
                }
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });

//prepare and download the audio file, onPrepared() method will be run when ready to play
        try {
            mediaplayer.reset();
            mediaplayer.setDataSource(this, path);
            mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  //in streaming mode
            mediaplayer.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // when Play/Pause button is clicked
// check whether the MediaPlayer is playing or not, start playing if not, otherwise, pause the playback
    public void onPlayUrlClick(View view) {
        if (mediaplayer.isPlaying()) {
            mediaplayer.pause();
            playbtn.setEnabled(true);
            stopbtn.setEnabled(true);
            playbtn.setImageResource(R.drawable.play);
        } else {
            mediaplayer.start();
            playbtn.setEnabled(true);
            stopbtn.setEnabled(true);
            playbtn.setImageResource(R.drawable.puase);
        }
    }
    // when Stop button is clicked
    public void onStopClick(View view) {
        mediaplayer.seekTo(0);
        playbtn.setEnabled(true);
        stopbtn.setEnabled(true);
    }
    @Override
    //when the audio file is ready to play
//enable the Play button and disable the Stop button
    public void onPrepared(MediaPlayer mediaplayer) {
        seekbar.setMax(mediaplayer.getDuration());
        changeSeekbar();
        playbtn.setEnabled(true);
        stopbtn.setEnabled(false);
    }

    private void changeSeekbar() {
        seekbar.setProgress(mediaplayer.getCurrentPosition());
        if (mediaplayer.isPlaying()) {
            handble = new Handler();
            runnable = new Runnable() {
                @Override
                public void run() {
                    changeSeekbar();
                }
            };
            handble.postDelayed(runnable, 1000);
        }
    };
    @Override
    //when the audio file plays to the end
    public void onCompletion(MediaPlayer mediaplayer) {
        mediaplayer.seekTo(0);
    }

    public void onbackClick(View view) {
        i = i - 5;
        mediaplayer.seekTo(i);
    }
    public void onskipClick(View view) {
        i = i + 5;
        mediaplayer.seekTo(i);
    }
}

1 Ответ

0 голосов
/ 17 апреля 2020

Вы не дали Looper своему Handler, что означает, что он вызовет changeSeekbar в случайном потоке. Поскольку обновления пользовательского интерфейса должны происходить в главном потоке, вы должны передать основной петлитель обработчику:

        handble = new Handler(Looper.getMainLooper());
        runnable = new Runnable() {
            @Override
            public void run() {
                changeSeekbar();
            }
        };
        handble.postDelayed(runnable, 1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...