Java 我想展示一下seekbar中播放的音乐的进度

Java 我想展示一下seekbar中播放的音乐的进度,java,android,android-studio,android-fragments,Java,Android,Android Studio,Android Fragments,我想展示一下seekbar中播放的音乐的进度。我不能这样做。请帮忙 我不明白这里有什么问题。我对编程非常陌生。我实际上正在尝试构建一个可以播放音乐的应用程序,音乐进度显示在seekbar上 package com.example.musicapp; import androidx.appcompat.app.AppCompatActivity; import android.media.MediaPlayer; import android.os.Bundle; import android.

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

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

        }

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

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

    
    

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

}
public类MainActivity扩展AppCompatActivity实现可运行{
MediaPlayer startmusic;
SeekBar-SeekBar;
图像按钮播放;
图像按钮暂停;
处理者;
可运行的可运行的;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play=findviewbyd(R.id.play_按钮);
seekBar=findViewById(R.id.seekBar);
pause=findViewById(R.id.pause_按钮);
startmusic=MediaPlayer.create(this,R.raw.music);
seekBar.setOnSeekbarchaneListener(新的seekBar.onSeekbarchaneListener(){
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
seekBarHint.setVisibility(View.VISIBLE);
}
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progress、boolean-fromTouch){
seekBarHint.setVisibility(View.VISIBLE);
int x=(int)Math.ceil(progress/1000f);
如果(x==0&&startmusic!=null&&!startmusic.isPlaying()){
clearMediaPlayer();
MainActivity.this.seekBar.setProgress(0);
}
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
if(startmusic!=null&&startmusic.isPlaying()){
startmusic.seekTo(seekBar.getProgress());
}
}
});
}
//看起来,您将此方法称为表单布局本身
//将您的播放方法定义更改为
公共音乐(视图五){
试一试{
play.setImageResource(R.drawable.pause);
play.setVisibility(play.GONE);
pause.setVisibility(pause.VISIBLE);
Toast Toast=Toast.makeText(getApplicationContext(),“正在播放音乐”,Toast.LENGTH\u SHORT);
toast.show();
if(startmusic==null){
startmusic=新媒体播放器();
}
AssetFileDescriptor afd=context.getResources().openRawResourceFd(/*您的原始id资源*/);
如果(afd==null)
返回;
startmusic.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
afd.close();
startmusic.prepare();
开始音乐设定音量(0.5f,0.5f);
startmusic.setLooping(假);
seekBar.setMax(startmusic.getDuration());
startmusic.start();
新线程(this.start();
}捕获(例外e){
e、 printStackTrace();
}
}
公共空间(视图五){
//添加空检查
if(startmusic!=null&&startmusic.isPlaying()){
开始音乐暂停();
play.setImageResource(R.drawable.pause);
play.setVisibility(play.VISIBLE);
pause.setVisibility(pause.GONE);
seekBar.setProgress(startmusic.getCurrentPosition());
Toast Toast=Toast.makeText(getApplicationContext(),“音乐暂停”,Toast.LENGTH\u SHORT);
toast.show();
}
}
公开募捐{
int currentPosition=startmusic.getCurrentPosition();
int total=startmusic.getDuration();
如果(currentPosition==总计){
clearMediaPlayer();
}
while(startmusic!=null&&startmusic.isPlaying()&¤tPosition
您可以使用MediaPlayer类的常用方法来显示进度:

  • 开始()
  • 停止()
  • 释放()–防止内存泄漏
  • seekTo(位置)-这将与SeekBar一起使用
  • isplay()–让我们知道是否正在播放歌曲
  • getDuration()–用于获取总持续时间。利用这个,我们将 知道SeekBar的上限。此函数返回 持续时间(毫秒)
  • setDataSource(FileDescriptor fd)–用于设置要播放的文件
  • setVolume(浮动左音量、浮动右音量)–用于设置 音量级别。该值是介于0之间的浮点值
    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;
        }
    
    }