现在的位置: 首页 > 综合 > 正文

定时器Timer和播放器MediaPlayer

2018年02月16日 ⁄ 综合 ⁄ 共 5454字 ⁄ 字号 评论关闭

http://blog.csdn.net/hellogv/article/details/6406732

在此文章的代码下做部分改动,已适应自己的需要,主要就是改为播放暂停同一个按钮,便于切换。

更主要的是复习定时器,另外在线音频播放不成功以后再研究吧。


播放器控制类

package com.example.mediaplayer;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.SeekBar;

public class Player implements OnBufferingUpdateListener, OnCompletionListener,
        MediaPlayer.OnPreparedListener ,OnErrorListener{
    public MediaPlayer mediaPlayer;
    private SeekBar skbProgress;
    private Timer mTimer = new Timer();

    public Player() {


        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnBufferingUpdateListener(this);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setOnCompletionListener(this);
        } catch (Exception e) {
            Log.e("mediaPlayer", "error", e);
        }

        mTimer.schedule(mTimerTask, 0, 1000);
    }

    public void setProgressBar(SeekBar skbProgress)
    {
      this.skbProgress = skbProgress;
    }
    
    /**
     * 通过定时器和Handler来更新进度条
     */
    TimerTask mTimerTask = new TimerTask() {
        @Override
        public void run() {
            if (mediaPlayer == null)
                return;
            if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) {
                handleProgress.sendEmptyMessage(0);
            }
            
        }
    };

    //处理消息
    Handler handleProgress = new Handler() {
        public void handleMessage(Message msg) {

            int position = mediaPlayer.getCurrentPosition();
            int duration = mediaPlayer.getDuration();

            if (duration > 0) {
                int pos = skbProgress.getMax() * position / duration;
                skbProgress.setProgress(pos);
            }
        };
    };


    
    //初始播放
    public void playUrl(String videoUrl) {
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(videoUrl);
            mediaPlayer.prepare();// prepare之后自动播放
            
//            File file = new File(videoUrl); 
//            FileInputStream fis = new FileInputStream(file); 
//            mediaPlayer.setDataSource(fis.getFD()); 
//            mediaPlayer.prepare(); 
            
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //暂停
    public void pause() {
        mediaPlayer.pause();
    }
    //播放
    public void play() {
        mediaPlayer.start();
    }
    //停止
    public void stop() {
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
            
            mediaPlayer = null;
        }
    }
    //判断是否正在播放
    public boolean isplaying()
    {
    	boolean playing = mediaPlayer.isPlaying();
    	return playing;
    }
    
    

    /**
     * 通过onPrepared播放
     */
    public void onPrepared(MediaPlayer arg0) {
        arg0.start();
        Log.e("mediaPlayer", "onPrepared");
    }

    public void onCompletion(MediaPlayer arg0) {
        Log.e("mediaPlayer", "onCompletion");
    }

    public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) {
        skbProgress.setSecondaryProgress(bufferingProgress);
        int currentProgress = skbProgress.getMax()
                * mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration();
        Log.e(currentProgress + "% play", bufferingProgress + "% buffer");
    }

    public boolean onError(MediaPlayer mp, int what, int extra) {
        return false;
    }

}

界面类

package com.example.mediaplayer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;

public class TestMedia extends Activity {
	private Button btnPause, btnPlayUrl, btnStop;
	private SeekBar skbProgress;
	private Player player;
	private int first;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		this.setTitle("在线音乐播放---hellogv编写");

		btnPlayUrl = (Button) this.findViewById(R.id.btnPlayUrl);
		btnPlayUrl.setOnClickListener(new ClickEvent());

		btnPause = (Button) this.findViewById(R.id.btnPause);
		btnPause.setOnClickListener(new ClickEvent());

		btnStop = (Button) this.findViewById(R.id.btnStop);
		btnStop.setOnClickListener(new ClickEvent());

		skbProgress = (SeekBar) this.findViewById(R.id.skbProgress);
		skbProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent());
		player = new Player();

	}

	class ClickEvent implements OnClickListener {

		public void onClick(View arg0) {

			player.setProgressBar(skbProgress);

			if (arg0 == btnPause) {// 播放暂停按钮

				if (player.isplaying())// 如果正在播放则暂停
				{
					player.pause();
					btnPause.setText("播放");
				} else// 如果暂停则播放
				{
					btnPause.setText("暂停");
					if (first == 0)// 初始播放
					{
						String luyin_Path = Environment
								.getExternalStorageDirectory()
								.getAbsolutePath()
								+ "/" + "she.mp3";

						player.playUrl(luyin_Path);
					} else// 继续播放
					{
						player.play();
					}
				}

				first++;

			} else if (arg0 == btnPlayUrl) {
				// // 在百度MP3里随便搜索到的,大家可以试试别的链接
				// String url = "http://219.138.125.22/myweb/mp3/CMP3/JH19.MP3";
				// player.playUrl(url);

				String music_path = "http://stream19.qqmusic.qq.com/30974808.mp3";

				player.playUrl(music_path);

			} else if (arg0 == btnStop) {
				player.stop();
			}
		}
	}

	class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {
		int progress;

		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {
			// 原本是(progress/seekBar.getMax())*player.mediaPlayer.getDuration()
			this.progress = progress * player.mediaPlayer.getDuration()
					/ seekBar.getMax();
		}

		public void onStartTrackingTouch(SeekBar seekBar) {
		}

		public void onStopTrackingTouch(SeekBar seekBar) {
			// seekTo()的参数是相对与影片时间的数字,而不是与seekBar.getMax()相对的数字
			player.mediaPlayer.seekTo(progress);
		}
	}

}

代码下载

http://download.csdn.net/detail/superjunjin/7070067

抱歉!评论已关闭.