Android媒体播放器和搜索栏同步问题

时间:2011-03-09 08:06:02

标签: android media-player seekbar

我正在制作媒体播放器应用。我正在尝试将其同步到搜索栏,以便在播放媒体时搜索栏自动进行。这是我的源代码:

public class MusicDroid extends ListActivity implements
        SeekBar.OnSeekBarChangeListener, Runnable {

    private int cur_time = 0;
    private SeekBar seekbar;
    int song_dur = 0;
    GroveService gs;
    public Chronometer timer;
    int timer_time = 0;

    @Override
    public void onCreate(Bundle icicle) {
        try {
            super.onCreate(icicle);
            setContentView(R.layout.songlist);
            gs = new GroveService();
            gs.updateSongList();
        } catch (NullPointerException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
        seekbar = (SeekBar) findViewById(R.id.SeekBar01);
        timer = (Chronometer) findViewById(R.id.Chronometer01);
        seekbar.setOnSeekBarChangeListener(this);
        // this.bindService(new Intent(this, GroveService.class), conn,
        // Context.BIND_AUTO_CREATE);
        ArrayAdapter<String> songList = new ArrayAdapter<String>(this,
                R.layout.song_item, gs.songs);
        setListAdapter(songList);
        timer.setOnChronometerTickListener(new OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer arg0) {
                // TODO Auto-generated method stub
                seekbar.setProgress(cur_time);
            }
        });
    }

    protected void onListItemClick(ListView l, View v, int position, long id) {
        timer.stop();
        timer.start();
        gs.playSong(position, 0);
    }

    /*
     * private ServiceConnection conn= new ServiceConnection(){
     * 
     * @Override public void onServiceConnected(ComponentName arg0, IBinder
     * arg1) { Log.v("Status:","Service Connected to player"); // TODO
     * Auto-generated method stub tprog= new Thread(new Runnable(){
     * 
     * }); tprog.setPriority(Thread.MIN_PRIORITY); tprog.start(); }
     * 
     * @Override public void onServiceDisconnected(ComponentName arg0) { // TODO
     * Auto-generated method stub
     * 
     * } };
     */
    // code for menu based media player controls
    /*
     * public boolean onOptionsItemSelected(MenuItem item) { switch
     * (item.getItemId()) { case R.id.prev: gs.prevSong(); break; case
     * R.id.play: gs.playSong(gs.songindex,cur_time); break; case R.id.pause:
     * gs.mp.getDuration(); gs.mp.pause(); break; case R.id.nxt: gs.nextSong();
     * break; } return true; }
     */

    public void myClickHandler(View view) {
        switch (view.getId()) {
        case R.id.ImageButton01:
            gs.prevSong();
            timer.stop();
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            timer.start();
            break;
        case R.id.ImageButton02:
            Thread t=new Thread();
            t.start();
            gs.playSong(gs.songindex, cur_time);
            timer.start();
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            break;
        case R.id.ImageButton03:
            cur_time = gs.getCurrentDuration(gs.songindex);

              if(gs.mp.isPlaying()){
              timer_time=Integer.parseInt((String)timer.getText());
              timer.stop(); 
              timer.setBase(timer_time);
              Log.v("Timer Time",String.valueOf(timer_time)); }
              gs.mp.pause(); 
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            break;
        case R.id.ImageButton04:
            gs.nextSong();
            timer.stop();
            timer.start();
            seekbar.setMax(gs.getSongDuration(gs.songindex));
            Log.v("SeekBar Max", String.valueOf(seekbar.getMax()));
            break;
        }
    }

    @Override
    public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
        // TODO Auto-generated method stub
        gs.mp.seekTo(arg1);
    }

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

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

    @Override
    public void run() {
        // TODO Auto-generated method stub
        int currentPosition = 0;
        int total = gs.mp.getDuration();
        seekbar.setMax(total);
        while (gs.mp != null && currentPosition < total) {
            try {
                Thread.sleep(1000);
                currentPosition = gs.mp.getCurrentPosition();
            } catch (InterruptedException e) {
                return;
            } catch (Exception e) {
                return;
            }
            seekbar.setProgress(currentPosition);
        }
    }
}

执行音乐播放的服务类。代码在这里:

class Mp3Filter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return (name.endsWith(".mp3"));
    }
}

public class GroveService extends Service {
    static final String MEDIA_PATH = new String("/sdcard/");
    List<String> songs = new ArrayList<String>();
    MediaPlayer mp = new MediaPlayer();
    int songindex = 0;
    int duration=0;
    //MusicDroid md;
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    public void onCreate()
    {
        super.onCreate();
        updateSongList();
        //md=new MusicDroid();
    }

    public void updateSongList() {
        File home = new File(MEDIA_PATH);
        if (home.listFiles(new Mp3Filter()).length > 0) {
            for (File file : home.listFiles(new Mp3Filter())) {
                songs.add(file.getName());
            }                                   
        }
    }
    public void playSong(final int position, final int cur_pos) {
        try {                     
            mp.reset();         
            mp.setDataSource(MEDIA_PATH + songs.get(position)); 
            mp.prepare();   
            //song_dur=mp.getDuration();
            mp.seekTo(cur_pos); 
            mp.start(); 
            duration=position;
            mp.setOnCompletionListener(new OnCompletionListener() {
                public void onCompletion(MediaPlayer arg0) {
                    nextSong();
                }
            });         
        } catch (IOException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
    }    

    public void nextSong() {
        if (++songindex >= songs.size())
            songindex = 0;
        else
            playSong(songindex,0);
    }

    public void prevSong() {
        songindex--;
        if (songindex > 0)
            playSong(songindex,0);
        else {
            songindex = 0;
            playSong(songindex,0);
        }
    }
    public int getSongDuration(int index)
    {   
        duration=mp.getDuration();
        Log.v("Song Duration", String.valueOf(duration));
        return duration;
    }
    public int getCurrentDuration(int index){
        int current_position;
        current_position=mp.getCurrentPosition();
        Log.v("Current Dur:",String.valueOf(current_position));
        return current_position;
    }
}

3 个答案:

答案 0 :(得分:7)

尝试此代码,此代码在我的系统中正常运行。

    package san.san;

    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.widget.Button;
    import android.widget.SeekBar;

    public class Mp3player extends Activity {

        private Button buttonPlayStop;
        private MediaPlayer mediaPlayer;
        private SeekBar seekBar;

        private final Handler handler = new Handler();

        // Here i override onCreate method.
        //
        // setContentView() method set the layout that you will see then
        // the application will starts
        //
        // initViews() method i create to init views components.
        @Override
        public void onCreate(Bundle icicle) {
                super.onCreate(icicle);
                setContentView(R.layout.main);
                initViews();  

        }

        // This method set the setOnClickListener and method for it (buttonClick())
        private void initViews() {
            buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop);
            buttonPlayStop.setOnClickListener(new OnClickListener() {public void onClick(View v) {buttonClick();}});

            mediaPlayer = MediaPlayer.create(this, R.raw.sound41772); 

            seekBar = (SeekBar) findViewById(R.id.SeekBar01);
            seekBar.setMax(mediaPlayer.getDuration());
            seekBar.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {
                seekChange(v);
                return false; }
            });

        }

        public void startPlayProgressUpdater() {
            seekBar.setProgress(mediaPlayer.getCurrentPosition());

            if (mediaPlayer.isPlaying()) {
                Runnable notification = new Runnable() {
                    public void run() {
                        startPlayProgressUpdater();
                    }
                };
                handler.postDelayed(notification,1000);
            }else{
                mediaPlayer.pause();
                buttonPlayStop.setText(getString(R.string.play_str));
                seekBar.setProgress(0);
            }
        } 

        // This is event handler thumb moving event
        private void seekChange(View v){
            if(mediaPlayer.isPlaying()){
                SeekBar sb = (SeekBar)v;
                mediaPlayer.seekTo(sb.getProgress());
            }
        }

        // This is event handler for buttonClick event
        private void buttonClick(){
            if (buttonPlayStop.getText() == getString(R.string.play_str)) {
                buttonPlayStop.setText(getString(R.string.pause_str));
                try{
                    mediaPlayer.start();
                    startPlayProgressUpdater();
                }catch (IllegalStateException e) {
                    mediaPlayer.pause();
                }
            }else {
                buttonPlayStop.setText(getString(R.string.play_str));
                mediaPlayer.pause();
            }
        }
    }

这是我的main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/widget31"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:text="@string/play_str"
        android:textSize="15pt"
        android:textStyle="bold"
        android:id="@+id/ButtonPlayStop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <SeekBar
        android:id="@+id/SeekBar01"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/ButtonPlayStop"/>
</RelativeLayout>

这是我的string.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Android mp3 player</string>
    <string name="play_str">PLAY</string>
    <string name="pause_str">PAUSE</string>
</resources>

这是我的清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="san.san"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Mp3player"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

答案 1 :(得分:6)

在MediaPlayer中,您可以设置onPreparedListener,您可以在其中同步搜索,如下所示

mMediaPlayer.setOnPreparedListener(new OnPreparedListener() 
          {
            @Override
            public void onPrepared(final MediaPlayer mp) 
            {
                seekBar.setMax(mp.getDuration());
                   new Thread(new Runnable() {

                           @Override
                           public void run() {
                                   while(mp!=null && mp.getCurrentPosition()<mp.getDuration())
                                   {
                                       seekBar.setProgress(mp.getCurrentPosition());
                                       Message msg=new Message();
                                       int millis = mp.getCurrentPosition();

                                       msg.obj=millis/1000;
                                       mHandler.sendMessage(msg);
                                        try {
                                            Thread.sleep(100);
                                        } 
                                        catch (InterruptedException e) {
                                           e.printStackTrace();
                                        }
                                   }
                           }
                   }).start();

            }
        });

答案 2 :(得分:0)

您需要在onProgressChanged()方法中更改一点代码。

试试这段代码:

public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
    // TODO Auto-generated method stub
           if(arg2){
                gs.mp.seekTo(arg1);
            }
}

您还可以查看我的下面的代码。这段代码在我的计算机和模拟器中运行良好。

我的Java代码:

public class MainActivity extends AppCompatActivity {

MediaPlayer player;
//Handler seekHandler = new Handler();
AudioManager audioManager;
SeekBar musicseek;

public void play(View view)
{
    player.start();
}
public void pause(View view)
{
    player.pause();
}

public void stop(View view)
{
    player.stop();
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    player=MediaPlayer.create(this,R.raw.music);
    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int maxvol= audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    int curvol= audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

    SeekBar bar=(SeekBar) findViewById(R.id.seekBar);
      bar.setMax(maxvol);
      bar.setProgress(curvol);
      musicseek= (SeekBar) findViewById(R.id.musicSeek);

    musicseek.setMax(player.getDuration());
    musicseek.setProgress(player.getCurrentPosition());

    final Handler han = new Handler();

    Runnable myRunnable = new Runnable() {
        @Override
        public void run() {

            musicseek.setProgress(player.getCurrentPosition());
            han.postDelayed(this, 1000);
        }
    };

    myRunnable.run();

    musicseek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            if(fromUser){
                player.seekTo(progress);
            }
        }
    });

    bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            //String temp=Integer.toString(progress);
            //Log.i("seekbar ",temp);

            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);
        }
    });

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

我的Xml代码可以在以下链接中找到:https://pastebin.com/a2Sdr0bB

我希望这有帮助!