天天看點

Android多媒體之音樂播放器

Android 音樂播放器有很多種方式,首先由一個音樂播放器:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    //進度條
    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/main_seekbar"
        android:layout_weight="1"
        />
        //播放按鈕
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_media_play"
        android:onClick="isPlayorPauser"/>
</LinearLayout>
           

第一種就是播放應用内的音頻檔案,将你需要播放的音頻檔案放入Raw檔案中,調用MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.cd);取到raw檔案中的音頻,再用MediaPlayer 的準備完成的監聽事件mediaPlayer.setOnPreparedListener() 中播放,mediaPlayer.start();方法。

第二種是記憶體卡裡面音頻檔案,首先執行個體化 MediaPlayer mediaPlayer = new MediaPlayer();再設定屬性。準備方法: mediaPlayer.prepare();

第三種是播放網絡音樂(Tomcat),需要配置Tomcat,再一步準備:mediaPlayer.prepareAsync();

public class MainActivity extends AppCompatActivity {

    private SeekBar main_seekbar;
    private MediaPlayer mediaPlayer;
    private SurfaceView main_surfaceview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main_seekbar = (SeekBar) findViewById(R.id.main_seekbar);
        //得到視訊播放器
        main_surfaceview = (SurfaceView) findViewById(R.id.main_surfaceview);

        //給進度條設定點選拖動事件
        main_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //擷取拖動的進度 給mediaPlayer設定進度
                int length=main_seekbar.getProgress();
                mediaPlayer.seekTo(length);
            }
        });
    }
    public void isPlayorPauser(View view) throws Exception{
        final ImageButton imageButton= (ImageButton) view;
        //如果mediaPlayer有值
        if (mediaPlayer==null) {
            //播放應用内的音頻檔案
            //mediaPlayer = MediaPlayer.create(this, R.raw.cd);
            //播放記憶體卡裡面音頻檔案
             mediaPlayer = new MediaPlayer();
            //設定音頻流的類型
             mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            //設定音源
            mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/kugou/mv/nlch.mp4"));
            //準備一下(記憶體卡)
            mediaPlayer.prepare();
            /* //播放網絡音樂(Tomcat)
            mediaPlayer.setDataSource(this, Uri.parse("http://192.168.43.135/internet.mp3"));
            //準備(異步準備)
            mediaPlayer.prepareAsync();*/
            //設定準備完成的監聽
//             mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
//                @Override
//                public void onPrepared(MediaPlayer mediaPlayer) {
                    //将媒體播放器的捕捉的畫面展示到surfaceView
                    mediaPlayer.setDisplay(main_surfaceview.getHolder());
                    //開始播放
                    mediaPlayer.start();
                    //設定按鈕改變圖檔
                    imageButton.setImageResource(android.R.drawable.ic_media_pause);
                    //擷取音樂的播放時長
                    int duration=mediaPlayer.getDuration();
                    //設定進度條的最大值(音樂的播放時長)
                    main_seekbar.setMax(duration);
                    new MyThread().start();
//                }
//            });
        }else if (mediaPlayer.isPlaying()){
            //開始就關閉
            mediaPlayer.pause();
            imageButton.setImageResource(android.R.drawable.ic_media_play);
        }else{
            //關閉就開始
            mediaPlayer.start();
            imageButton.setImageResource(android.R.drawable.ic_media_pause);
        }
    }

    class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            //判斷拖動長度是否小于seekbar的最大長度
            if (main_seekbar.getProgress()<=main_seekbar.getMax()){
                //擷取音樂的目前播放位置
                int c=mediaPlayer.getCurrentPosition();
                //設定seekbar的位置
                main_seekbar.setProgress(c);
            }
        }
    }
}
           

最後,我在說一個控件,叫音頻池(SoundPool),雖然已經過時。但是還可以用。用來做一些混音。有興趣的可以了解下:

public class SoundPoolActivity extends AppCompatActivity {

    private SoundPool soundPool;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_soundpool);
        //執行個體化音頻池
        soundPool = new SoundPool(, AudioManager.STREAM_MUSIC,);
        //設定監聽事件(加載音頻)
        soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int i, int i1) {
                //播放
                soundPool.play(i,,,,-,);
            }
        });
    }
    public void playKFC(View view){
        soundPool.load(this,R.raw.rooster,);
    }
    public void playTwo(View view){
        soundPool.load(this,R.raw.chimp,);
    }
    public void playThree(View view){
        soundPool.load(this,R.raw.crickets,);
    }
    public void playFour(View view){
        soundPool.load(this,R.raw.roar,);
    }
    public void playDog(View view){
        soundPool.load(this,R.raw.dogbark,);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出應用程式時關閉音頻池
        if(soundPool!=null){
            soundPool.release();
            soundPool=null;
        }
    }
}