Android音频SeekBar

Android音频SeekBar,android,audio,media-player,seekbar,Android,Audio,Media Player,Seekbar,我正在尝试创建一个可以播放单个音频文件的东西,并且可以通过进度/搜索栏暂停和操作。我希望有一个图像占据大部分屏幕,然后在左下角有一个播放暂停按钮,在按钮右侧有一个栏。seekbar没有链接到音频,一切正常。我的进度条形码很可能是一团糟,因为如果从我在互联网上看到的几个条形码中取出来的话,它们对我来说大多是令人困惑的,因为它们是用于音乐播放器应用程序,而不是用于播放单个音频文件 有人能帮我弄一下进度条吗?关于改进我的编程的任何其他提示也将非常好 (我对android和编程非常陌生,只是想提醒你)

我正在尝试创建一个可以播放单个音频文件的东西,并且可以通过进度/搜索栏暂停和操作。我希望有一个图像占据大部分屏幕,然后在左下角有一个播放暂停按钮,在按钮右侧有一个栏。seekbar没有链接到音频,一切正常。我的进度条形码很可能是一团糟,因为如果从我在互联网上看到的几个条形码中取出来的话,它们对我来说大多是令人困惑的,因为它们是用于音乐播放器应用程序,而不是用于播放单个音频文件

有人能帮我弄一下进度条吗?关于改进我的编程的任何其他提示也将非常好

(我对android和编程非常陌生,只是想提醒你)

这是我的Java:

MediaPlayer mediaPlayer;
    Button buttonPlayPause;
    ImageView Image;
    SeekBar seekBar;

    private int stateMediaPlayer;
    private final int stateMP_NotStarter = 0;
    private final int stateMP_Playing = 1;
    private final int stateMP_Pausing = 2;
    int total;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playerwere);

        Image = (ImageView) findViewById(R.id.pdfview);
        Image.setImageResource(R.drawable.wereim);

        seekBar = (SeekBar) findViewById(R.id.seekBar);

        buttonPlayPause = (Button) findViewById(R.id.playpause);

        buttonPlayPause.setOnClickListener(buttonPlayPauseOnClickListener);

        seekBar.setOnSeekBarChangeListener(seekBarOnSeekListener);

        initMediaPlayer();

        Thread currentThread = new Thread(this);
        currentThread.start();

    }

    private void initMediaPlayer() {
        mediaPlayer = new MediaPlayer();
        mediaPlayer = MediaPlayer.create(were.this, R.raw.were);
        stateMediaPlayer = stateMP_NotStarter;

        mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer arg0) {
                // TODO Auto-generated method stub
                total = mediaPlayer.getDuration();
            }

        });

        seekBar.setProgress(0);
        seekBar.setMax(total);
    }

    Button.OnClickListener buttonPlayPauseOnClickListener = new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (stateMediaPlayer) {
            case stateMP_NotStarter:
                mediaPlayer.start();
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause);
                stateMediaPlayer = stateMP_Playing;
                break;
            case stateMP_Playing:
                mediaPlayer.pause();
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_play);
                stateMediaPlayer = stateMP_Pausing;
                break;
            case stateMP_Pausing:
                mediaPlayer.start();
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause);
                stateMediaPlayer = stateMP_Playing;
                break;
            }

        }
    };

    SeekBar.OnSeekBarChangeListener seekBarOnSeekListener = new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            // TODO Auto-generated method stub

            if (fromUser) {
                mediaPlayer.seekTo(progress);
                seekBar.setProgress(progress);
            }

        }
    };

    @Override
    public void run() {
        // TODO Auto-generated method stub

        try {
            while (mediaPlayer != null) {
                int currentPosition = mediaPlayer.getCurrentPosition();
                Message msg = new Message();
                msg.what = currentPosition;
                threadHandler.sendMessage(msg);
            }
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private Handler threadHandler = new Handler() {
        public void handleMessage(Message msg) {
            seekBar.setProgress(msg.what);
        }
    };
这就是我尝试使用seekBar之前的java:

    MediaPlayer mediaPlayer;
    Button buttonPlayPause;
    ImageView Image;

    private int stateMediaPlayer;
    private final int stateMP_NotStarter = 0;
    private final int stateMP_Playing = 1;
    private final int stateMP_Pausing = 2;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playerwere);

        Image = (ImageView) findViewById(R.id.pdfview);
        Image.setImageResource(R.drawable.wereim);

        buttonPlayPause = (Button) findViewById(R.id.playpause);

        buttonPlayPause.setOnClickListener(buttonPlayPauseOnClickListener);

        initMediaPlayer();

    }

    private void initMediaPlayer() {
        mediaPlayer = new MediaPlayer();
        mediaPlayer = MediaPlayer.create(were.this, R.raw.were);
        stateMediaPlayer = stateMP_NotStarter;
    }

    Button.OnClickListener buttonPlayPauseOnClickListener = new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (stateMediaPlayer) {
            case stateMP_NotStarter:
                mediaPlayer.start();
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause);
                stateMediaPlayer = stateMP_Playing;
                break;
            case stateMP_Playing:
                mediaPlayer.pause();
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_play);
                stateMediaPlayer = stateMP_Pausing;
                break;
            case stateMP_Pausing:
                mediaPlayer.start();
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause);
                stateMediaPlayer = stateMP_Playing;
                break;
            }

        }
    };
这是我在Vishal Vaja回答后的java:

MediaPlayer mediaPlayer;
    Button buttonPlayPause;
    ImageView Image;
    SeekBar seekBar;
    Handler handler;

    private int stateMediaPlayer;
    private final int stateMP_NotStarter = 0;
    private final int stateMP_Playing = 1;
    private final int stateMP_Pausing = 2;
    private int mediaPos;
    private int mediaMax;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playerwere);

        Image = (ImageView) findViewById(R.id.pdfview);

        Image.setImageResource(R.drawable.wereim);

        seekBar = (SeekBar) findViewById(R.id.seekBar);

        buttonPlayPause = (Button) findViewById(R.id.playpause);

        buttonPlayPause.setOnClickListener(buttonPlayPauseOnClickListener);

        seekBar.setOnSeekBarChangeListener(seekBarOnSeekChangeListener);

        initMediaPlayer();

    }

    private void initMediaPlayer() {
        handler = new Handler();
        mediaPlayer = new MediaPlayer();
        mediaPlayer = MediaPlayer.create(were.this, R.raw.were);
        stateMediaPlayer = stateMP_NotStarter;
        mediaPos = mediaPlayer.getCurrentPosition();

        mediaMax = mediaPlayer.getDuration();

        seekBar.setMax(mediaMax); // Set the Maximum range of the
                                    // seekBar.setProgress(mediaPos);// set
                                    // current progress to song's

        handler.removeCallbacks(moveSeekBarThread);
        handler.postDelayed(moveSeekBarThread, 100);
    }

    private Runnable moveSeekBarThread = new Runnable() {

        public void run() {
            if (mediaPlayer.isPlaying()) {

                int mediaPos_new = mediaPlayer.getCurrentPosition();
                int mediaMax_new = mediaPlayer.getDuration();
                seekBar.setMax(mediaMax_new);
                seekBar.setProgress(mediaPos_new);

                handler.postDelayed(this, 100); // Looping the thread after 0.1
                                                // second
                                                // seconds
            }
        }
    };

    Button.OnClickListener buttonPlayPauseOnClickListener = new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (stateMediaPlayer) {
            case stateMP_NotStarter:
                mediaPlayer.start();
                buttonPlayPause
                        .setBackgroundResource(android.R.drawable.ic_media_pause);
                stateMediaPlayer = stateMP_Playing;
                break;
            case stateMP_Playing:
                mediaPlayer.pause();
                buttonPlayPause
                        .setBackgroundResource(android.R.drawable.ic_media_play);
                stateMediaPlayer = stateMP_Pausing;
                break;
            case stateMP_Pausing:
                mediaPlayer.start();
                buttonPlayPause
                        .setBackgroundResource(android.R.drawable.ic_media_pause);
                stateMediaPlayer = stateMP_Playing;
                break;
            }

        }
    };

    SeekBar.OnSeekBarChangeListener seekBarOnSeekChangeListener = new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            // TODO Auto-generated method stub

            if (fromUser) {
                mediaPlayer.seekTo(progress);
                seekBar.setProgress(progress);
            }

        }
    };

我想这对你来说是可行的

创建一个线程来检查歌曲位置,并像这样移动搜索栏,

private Runnable moveSeekBarThread = new Runnable() {

    public void run() {
        if(mediaPlayer.isplaying){

        int mediaPos_new = mediaPlayer.getCurrentPosition();
        int mediaMax_new = mediaPlayer.getDuration();
        seekBar.setMax(mediaMax_new);
        seekBar.setProgress(mediaPos_new);

        handler.postDelayed(this, 100); //Looping the thread after 0.1 second
                                        // seconds
        }  
    }
};
  mediaPos = mediaPlayer.getCurrentPosition();
  mediaMax = mediaPlayer.getDuration();

  seekBar.setMax(mediaMax); // Set the Maximum range of the
  seekBar.setProgress(mediaPos);// set current progress to song's

  handler.removeCallbacks(moveSeekBarThread);
  handler.postDelayed(moveSeekBarThread, 100);
并像这样调用该线程,

private Runnable moveSeekBarThread = new Runnable() {

    public void run() {
        if(mediaPlayer.isplaying){

        int mediaPos_new = mediaPlayer.getCurrentPosition();
        int mediaMax_new = mediaPlayer.getDuration();
        seekBar.setMax(mediaMax_new);
        seekBar.setProgress(mediaPos_new);

        handler.postDelayed(this, 100); //Looping the thread after 0.1 second
                                        // seconds
        }  
    }
};
  mediaPos = mediaPlayer.getCurrentPosition();
  mediaMax = mediaPlayer.getDuration();

  seekBar.setMax(mediaMax); // Set the Maximum range of the
  seekBar.setProgress(mediaPos);// set current progress to song's

  handler.removeCallbacks(moveSeekBarThread);
  handler.postDelayed(moveSeekBarThread, 100);

公共类DetailMusic扩展活动实现View.OnClickListener{

SeekBar seek_bar;
Button play_button, pause_button;
TextView text_shown;
Handler seekHandler = new Handler();
Bundle bundle = new Bundle();
String Musicnames;
int mediaMax;
int mediaPos = 0;
MediaPlayer mp = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detailmusic);
    bundle = getIntent().getExtras();
    if (bundle != null) {
        Musicnames = bundle.getString("musicnbames");
        System.out.println("++++++++++++++++++++++++++++++++" + Musicnames);
        Log.e("musicfoldername", Musicnames);
    }
    seek_bar = (SeekBar) findViewById(R.id.seek_bar);
    play_button = (Button) findViewById(R.id.play_button);
    pause_button = (Button) findViewById(R.id.pause_button);
    text_shown = (TextView) findViewById(R.id.text_shown);
    play_button.setOnClickListener(this);
    pause_button.setOnClickListener(this);
    //seekUpdation();

    String PATH_TO_FILE = Musicnames;
    // MediaPlayer mp = new MediaPlayer();
    try {
        mp.setDataSource(PATH_TO_FILE);
        mp.prepare();
    } catch (IOException e) {

    }
    mp.start();
    seek_bar.setMax(mp.getDuration());

    try {
        mp.setDataSource(Musicnames);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mediaPos = mp.getCurrentPosition();
    mediaMax = mp.getDuration();
    seek_bar.setMax(mediaMax); // Set the Maximum range of the
    seek_bar.setProgress(mediaPos);// set current progress to song's
    seekHandler.removeCallbacks(moveSeekBarThread);
    seekHandler.postDelayed(moveSeekBarThread, 100); //cal the thread after 100 milliseconds

}

private Runnable moveSeekBarThread = new Runnable() {
    public void run() {
        if (mp.isPlaying()) {
            int mediaPos_new = mp.getCurrentPosition();
            int mediaMax_new = mp.getDuration();
            seek_bar.setMax(mediaMax_new);
            seek_bar.setProgress(mediaPos_new);
            seekHandler.postDelayed(this, 100); //Looping the thread after 0.1 second
        }
    }
};


@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.play_button:
            mp.reset();
//mp.start(); 显示的文本。setText(“播放…”)


}

好的,我已经试过了,但我认为我没有把它放在正确的位置,因为现在当音频播放时,条仍然不会移动,但如果我移动搜索杆,音频会进行搜索。我把我的新代码放在了原始问题中,因为ui不能从任何其他线程更新,所以可能无法工作。添加某种类型的接口。