简体   繁体   中英

Why does the SeekBar not move when sound is played via MediaController (Android)?

I'm trying play an audio file with the mediacontroler in my android application. When playing audio the seekbar does not move.I looked mediacontroler function. But I could not find a function for updating seekbar. please advice.

public class Show_subject_Activity extends Activity
    implements MediaController.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener {
private RatingBar box_litner;
private MediaController mController;
private MediaPlayer mPlayer;
private Cursor cur;
int bufferPercent = 0;
DB_Nabege_helper db_nabege = new DB_Nabege_helper(this);
private String voicefileName;

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

    box_litner = (RatingBar) findViewById(R.id.ratingBar1);
    mController = (MediaController) findViewById(R.id.mediaController_voice);
    mController.setAnchorView(null);
    db_nabege.open();
    cur = db_nabege.getSubject(Intent_values.id_subject);
    voicefileName = getVoiceFileName();
    db_nabege.close();
}

@Override
public void onResume() {
    super.onResume();
    mPlayer = new MediaPlayer();
    // Set the audio data source
    try {
        mPlayer.setDataSource(this, getUriVoice());
        mPlayer.prepare();
    } catch (Exception e) {
        e.printStackTrace();
    }
    // Set an image for the album cover
    // coverImage.setImageResource(R.drawable.icon);

    mController.setMediaPlayer(this);
    mController.setEnabled(true);
}

private Uri getUriVoice() {
    File voiceFile = null;
    try {
        voiceFile = new File(Environment.getExternalStorageDirectory().getPath() + "/nabege" + File.separator
                + "audio" + File.separator + voicefileName);
    } catch (Exception e) {
        Log.d("log", e.toString());
    }
    Uri voiceUri = Uri.fromFile(voiceFile);
    return voiceUri;
}

@Override
public void onPause() {
    super.onPause();
    mPlayer.release();
    mPlayer = null;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    mController.show();
    return super.onTouchEvent(event);
}

// MediaPlayerControl Methods
@Override
public int getBufferPercentage() {
    return bufferPercent;
}

@Override
public int getCurrentPosition() {
    return mPlayer.getCurrentPosition();
}

@Override
public int getDuration() {
    return mPlayer.getDuration();
}

@Override
public boolean isPlaying() {
    return mPlayer.isPlaying();
}

@Override
public void pause() {
    mPlayer.pause();
}

@Override
public void seekTo(int pos) {
    mPlayer.seekTo(pos);
}

@Override
public void start() {
    mPlayer.start();
}

// BufferUpdateListener Methods
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
    bufferPercent = percent;
}

public boolean canPause() {
    return true;
}

public boolean canSeekBackward() {
    return true;
}

public boolean canSeekForward() {
    return true;
}

@Override
public int getAudioSessionId() {
    return 0;
}
}

You can update the seekbar yourself, eg:

final Handler mHandler = new Handler();
final Runnable mUpdateSeekbar = new Runnable() {
    public void run() {
        mSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
        mSeekBar.setMax(mMediaPlayer.getDuration());
        mHandler.postDelayed(this, 1000);
    }
};

Post the runnable in onResume and mHandler.removeCallbacks(mUpdateSeekbar) in onPause .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM