【问题标题】:I want to show the progress of the music played in the seekbar我想显示在搜索栏中播放的音乐的进度
【发布时间】:2020-09-11 17:57:22
【问题描述】:

我想显示在搜索栏中播放音乐的进度。我不能这样做。请帮忙!
我不明白这里有什么问题。我对编程非常陌生。我实际上正在尝试构建一个可以播放音乐的应用程序,并且音乐进度显示在搜索栏上

package com.example.musicapp;
import androidx.appcompat.app.AppCompatActivity;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {
MediaPlayer startmusic;
SeekBar seekBar;
ImageButton play;
ImageButton pause;
    Handler handler;
    Runnable runnable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        play=findViewById(R.id.play_button);
        seekBar=findViewById(R.id.seekBar);
        pause=findViewById(R.id.pause_button);
startmusic=MediaPlayer.create(this,R.raw.music);
    }
public void playmusic(View v){
        startmusic.start();
        play.setImageResource(R.drawable.pause);
                play.setVisibility(play.GONE);
                pause.setVisibility(pause.VISIBLE);
                seekBar.setMax(startmusic.getDuration());
    Toast toast=Toast.makeText(getApplicationContext(),"Music is playing", Toast.LENGTH_SHORT);
    toast.show();
    changeSeekbar();
}

    private void changeSeekbar() {
        if(startmusic.isPlaying()){
            seekBar.setProgress(startmusic.getCurrentPosition());
            runnable=new Runnable() {
                @Override
                public void run() {
                changeSeekbar();
                    handler.postDelayed(runnable,100);
                }
            };

        }

    }

    public void pausemusic(View v){
        if(startmusic.isPlaying()) {
            startmusic.pause();
            play.setImageResource(R.drawable.pause);
            play.setVisibility(play.VISIBLE);
            pause.setVisibility(pause.GONE);
            seekBar.setProgress(startmusic.getCurrentPosition());
            Toast toast=Toast.makeText(getApplicationContext(),"Music is paused", Toast.LENGTH_SHORT);
            toast.show();
        }
    }

        }

【问题讨论】:

    标签: java android android-studio android-fragments


    【解决方案1】:

    您可以使用 MediaPlayer 类的常用方法来显示进度:

    • 开始()
    • 停止()
    • release() – 防止内存泄漏。
    • seekTo(position) – 这将与 SeekBar 一起使用
    • isPlaying() - 让我们知道歌曲是否正在播放。
    • getDuration() – 用于获取总持续时间。使用它,我们将 知道我们 SeekBar 的上限。该函数返回 持续时间(毫秒)
    • setDataSource(FileDescriptor fd) - 用于设置要播放的文件。
    • setVolume(float leftVolume, float rightVolume) - 用于设置 音量级别。该值是介于 0 或 1 之间的浮点数。

      <SeekBar
          android:id="@+id/seekbar"
          android:layout_margin="16dp"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_gravity="center" />
      

    MainActivity.java 类的代码如下:

    public class MainActivity extends AppCompatActivity implements Runnable {
        MediaPlayer startmusic;
        SeekBar seekBar;
        ImageButton play;
        ImageButton pause;
        Handler handler;
        Runnable runnable;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            play=findViewById(R.id.play_button);
            seekBar=findViewById(R.id.seekBar);
            pause=findViewById(R.id.pause_button);
            startmusic=MediaPlayer.create(this,R.raw.music);
    
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
    
                    seekBarHint.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
                    seekBarHint.setVisibility(View.VISIBLE);
                    int x = (int) Math.ceil(progress / 1000f);
    
                    if (x == 0 && startmusic != null && !startmusic.isPlaying()) {
                        clearMediaPlayer();
                        MainActivity.this.seekBar.setProgress(0);
                    }
    
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
    
                    if (startmusic != null && startmusic.isPlaying()) {
                        startmusic.seekTo(seekBar.getProgress());
                    }
                }
            });
    
        }
    
        //its look that you call this method form layout itself
        //change your play method defination to 
        public void playmusic(View v) {
    
          try {
            play.setImageResource(R.drawable.pause);
            play.setVisibility(play.GONE);
            pause.setVisibility(pause.VISIBLE);
            Toast toast=Toast.makeText(getApplicationContext(),"Music is playing", Toast.LENGTH_SHORT);
            toast.show();
    
                    if (startmusic == null) {
                        startmusic = new MediaPlayer();
                    }
    
    
                    AssetFileDescriptor afd = context.getResources().openRawResourceFd(/*your raw id resource*/);
                    if (afd == null)
                     return;
                    startmusic.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                    afd.close();
    
                    startmusic.prepare();
                    startmusic.setVolume(0.5f, 0.5f);
                    startmusic.setLooping(false);
                    seekBar.setMax(startmusic.getDuration());
    
                    startmusic.start();
                    new Thread(this).start();
            } catch (Exception e) {
                e.printStackTrace();
    
            }
    }
    
        public void pausemusic(View v) {
            //add null check
            if(startmusic != null && startmusic.isPlaying()) {
                startmusic.pause();
                play.setImageResource(R.drawable.pause);
                play.setVisibility(play.VISIBLE);
                pause.setVisibility(pause.GONE);
                seekBar.setProgress(startmusic.getCurrentPosition());
                Toast toast=Toast.makeText(getApplicationContext(),"Music is paused", Toast.LENGTH_SHORT);
                toast.show();
            }
        }
    
        public void run() {
    
            int currentPosition = startmusic.getCurrentPosition();
            int total = startmusic.getDuration();
    
            if (currentPosition == total) {
                clearMediaPlayer();
            }
    
    
            while (startmusic != null && startmusic.isPlaying() && currentPosition < total) {
                try {
                    Thread.sleep(1000);
                    currentPosition = startmusic.getCurrentPosition();
                } catch (InterruptedException e) {
                    return;
                } catch (Exception e) {
                    return;
                }
    
                seekBar.setProgress(currentPosition);
    
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            clearMediaPlayer();
        }
    
        private void clearMediaPlayer() {
            startmusic.stop();
            startmusic.release();
            startmusic = null;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      相关资源
      最近更新 更多