Java 我想展示一下seekbar中播放的音乐的进度
我想展示一下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上
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之间的浮点值
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; } }