android自定义视频播放器

本文介绍了一款基于Android平台的自定义视频播放器的实现方法。该播放器利用Surface和MediaPlayer组件,支持本地视频及网络视频播放,并具备进度条、音量控制等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上找了很多相关资料,感觉没有自己想要的,最后决定还是自己来写一个吧。

源代码已经放到资源库中,欢迎下载:http://download.youkuaiyun.com/detail/luozhi3527/5353003

程序通过surface+mediaplayer来实现,自定义控制台。能播放本地视频和网络视频。

主要实现代码如下:

package com.xluo.mediaplayertest;

import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.app.ProgressDialog;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnInfoListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class TestVideoPlayer extends Activity 
implements OnCompletionListener,OnErrorListener,OnInfoListener,
OnPreparedListener,OnSeekCompleteListener,OnVideoSizeChangedListener,
SurfaceHolder.Callback{
    public static final String TAG = "TestVideoPlayer";
    
    
    private boolean isExit = false;
    private int currentMusicPosition; //当前音量
	String url =null;
	private Uri uri;
	private String name;
	private ImageButton playBtn = null;//播放、暂停
	private TextView playtime = null;//已播放时间
	private TextView durationTime = null;//总时间
	private TextView VideoName = null;
	private SeekBar seekbar = null;//进度
	private SeekBar soundBar = null;//音量调节
	private Handler handler = new Handler(){
		public void handleMessage(Message msg){
			super.handleMessage(msg);
			switch (msg.what) {
			case 1:
				if(mediaPlayer!=null)
					currentPosition = mediaPlayer.getCurrentPosition();
				
				seekbar.setProgress(currentPosition);
				playtime.setText(toTime(currentPosition));
				handler.sendEmptyMessage(1);
				break;

			default:
				break;
			}
			
		}
	};//用于进度条
	
	private int currentPosition;//当前播放位置
	private ProgressDialog dialog;  //加载等待框
	private AudioManager mAudioManager = null;
	private View video_contrlbar,titlebar;
	private boolean isControlBarShow = true;
    Display currentDisplay;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    MediaPlayer mediaPlayer;//使用的是MediaPlayer来播放视频
    int ScurrentPosition;  //音量 
    Timer showController = new Timer();
    TimerTask timerTask ;
   private Handler fHandler = new Handler(){
		public void handleMessage(Message msg){
			super.handleMessage(msg);
			switch(msg.what){
			case 1:
				video_contrlbar.setVisibility(View.GONE);
				titlebar.setVisibility(View.GONE);
				isControlBarShow = false;
				break;
			default:
				break;
			}
		}
	};//用于控制台显隐
    boolean readyToPlayer = false;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  //设置屏幕常亮
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);		//设置满屏
        setContentView(R.layout.activity_main);
        
        name = "晴天";
        url = "/sdcard/sunny_night.mp4";  //网络视频和本地视频都可以的
        Log.d(TAG," url :"+url);
        
        dialog = new ProgressDialog(this);  //设置等待
		dialog.setMessage("加载中...");
		dialog.show();
		
		//控制台
		video_contrlbar = (View)findViewById(R.id.video_contrlbar);
		titlebar = (View)findViewById(R.id.video_titlebar);
		showControlBar();
		/*时间*/
		playtime = (TextView)findViewById(R.id.video_playtime);//已经播放的时间
		durationTime = (TextView)findViewById(R.id.video_duration);//总时间
		VideoName = (TextView)findViewById(R.id.play_movie_name);
		VideoName.setText(name);
		
		/*播放、暂停、停止按钮设置*/
		playBtn = (ImageButton)findViewById(R.id.video_playBtn);//开始播放
		playBtn.setOnClickListener(new View.OnClickListener() {	
			@Override
			public void onClick(View v) {
				if (mediaPlayer.isPlaying()){
					pause();
					playBtn.setBackgroundResource(R.drawable.video_play_selector);
				} else{
					play();
					playBtn.setBackgroundResource(R.drawable.video_pause_selector);
					
				}
			}
		});
		
		//进度条
		seekbar = (SeekBar)findViewById(R.id.video_seekbar);
		
		seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				
			}
			
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				
			}
			
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				if(fromUser)
					mediaPlayer.seekTo(progress);
			}
		});
		
		/*音量控制条*/
		soundBar = (SeekBar)findViewById(R.id.video_sound);
		soundBar.setOnSeekBarChangeListener(new 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){
					int ScurrentPosition = soundBar.getProgress();
					mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, ScurrentPosition, 0);
					
				}
			}
		});
		
        surfaceView = (SurfaceView)findViewById(R.id.SurfaceView);  
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        
        surfaceView.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				showControlBar(); //点击屏幕时,调出控制台;
			}
		});        
        setup();
        currentDisplay = getWindowManager().getDefaultDisplay();
    }
    
    	private void showControlBar(){   //控制台的显隐
    		video_contrlbar.setVisibility(View.VISIBLE);
    		titlebar.setVisibility(View.VISIBLE);
    		isControlBarShow = true;
    		if(timerTask != null){
    			timerTask.cancel();
    		}
    		timerTask = new TimerTask(){

    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				if(isControlBarShow){
    					Message msg = fHandler.obtainMessage(1);
    					fHandler.sendMessage(msg);
    				}
    			}
    	    	
    	    };
    	    showController.schedule(timerTask, 5000);  //5秒后隐藏
    	}
    	Runnable contrlShow = new Runnable(){

			@Override
			public void run() {
				// TODO Auto-generated method stub
				video_contrlbar.setVisibility(View.GONE);
				titlebar.setVisibility(View.GONE);
				isControlBarShow = false;
				fHandler.postDelayed(contrlShow, 5000);

			}
    		
    	};

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                        int height) {                
        }
        
        private void loadClip(){
    		if (mediaPlayer != null) {
    			mediaPlayer.reset();
    			mediaPlayer.release();
    			mediaPlayer = null;
    		}
    		mediaPlayer = new MediaPlayer();//创建多媒体对象
            mediaPlayer.setOnCompletionListener(this);
            mediaPlayer.setOnErrorListener(this);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setOnSeekCompleteListener(this);
            mediaPlayer.setOnVideoSizeChangedListener(this);
            
    		//ListEntity entity = dbDao.find(position);
    		//Log.d(TAG,"list entity object :"+entity);
    		//String url = entity.getUrl();
    		Log.d(TAG,"url :"+url);
    		uri = Uri.parse(url);
    		Log.d(TAG,"media url :"+url);
    	    //uri = Uri.withAppendedPath(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
    		//		"" + pos);
    	    try {
    	    	mediaPlayer.setDataSource(this, uri);
    			
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	    
    	}
    	
    	private void setup(){
    		loadClip();
    		try {
    			mediaPlayer.prepare();
    			mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    				
    				@Override
    				public void onPrepared(final MediaPlayer mp) {
    					seekbar.setMax(mp.getDuration());//设置播放进度条最大值
    					handler.sendEmptyMessage(1);//向handler发送消息,启动播放进度条
    					playtime.setText(toTime(mp.getCurrentPosition()));//初始化播放时间
    					durationTime.setText(toTime(mp.getDuration()));//设置时间
    					mp.seekTo(currentPosition);//初始化MediaPlayer播放位置
    					/*获得最大音量*/
    					mAudioManager = (AudioManager) TestVideoPlayer.this.getSystemService(TestVideoPlayer.this.AUDIO_SERVICE);
    					int maxSound = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
    					
    					/*获得当前音量*/
    					int currentSound = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
    					
    					soundBar.setMax(maxSound);
    					soundBar.setProgress(currentSound);

    				}
    			});
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	private void play(){
    		Log.d(TAG,"cancel dialog:"+dialog);
    		/*  设置视频尺寸  */
    		int tmpWidth = currentDisplay.getHeight();
    		int tmpHeight = currentDisplay.getWidth();
    		
            surfaceView.setLayoutParams(new LinearLayout.LayoutParams(tmpHeight,tmpWidth*3/4));
    		if(dialog != null){
    			dialog.dismiss();
    		}
    		mediaPlayer.start();
    		playBtn.setBackgroundResource(R.drawable.video_pause_selector);
    	}
    	
    	private void pause(){
    		mediaPlayer.pause();	
    	}
    	
    	
    	public String toTime(int time) {

    		time /= 1000;
    		int minute = time / 60;
    		int hour = minute / 60;
    		int second = time % 60;
    		minute %= 60;
    		return String.format("%02d:%02d:%02d", hour,minute, second);
    	}
    

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
        	Log.d(TAG,"surafce created");
        	mediaPlayer.setDisplay(surfaceHolder);//若无次句,将只有声音而无图像   
    		play();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {   //surface销毁时结束播放,防止按下home键后仍有声音,但无法播放图像。

                if (mediaPlayer != null) {
    				mediaPlayer.reset();
    				mediaPlayer.release();
    				mediaPlayer = null;
    			}
    			finish();
                
        }

        @Override
        public void onVideoSizeChanged(MediaPlayer arg0, int arg1, int arg2) {
                
        }

        @Override
        public void onSeekComplete(MediaPlayer mp) {
                
        }

        @Override
        public void onPrepared(MediaPlayer mp) {
               
        }

        @Override
        public boolean onInfo(MediaPlayer arg0, int whatInfo, int extra) {

                return false;
        }

        @Override
        public boolean onError(MediaPlayer arg0, int arg1, int arg2) {

                return false;
        }

        @Override
        public void onCompletion(MediaPlayer arg0) { //播放完后自动退出
                finish();
        }
        public boolean onKeyDown(int keyCode, KeyEvent event) {
    		
    		switch (keyCode) {
    		case KeyEvent.KEYCODE_BACK:
    			exitBy2Click();
    			break;
    		case KeyEvent.KEYCODE_VOLUME_DOWN:    //音量键的控制,调出控制台
    			Log.d(TAG,"to pressed voice down");
    			showControlBar();
    			currentMusicPosition = soundBar.getProgress();
    			currentMusicPosition--;
    			mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentMusicPosition, 0);
    			soundBar.setProgress(currentMusicPosition);
    			break;
    		case KeyEvent.KEYCODE_VOLUME_UP:
    			Log.d(TAG,"to pressed voice up");
    			showControlBar();
    			currentMusicPosition = soundBar.getProgress();
    			currentMusicPosition++;
    			mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentMusicPosition, 0);
    			soundBar.setProgress(currentMusicPosition);
    			break;
    			default:
    				super.onKeyDown(keyCode, event);
    		  }
    		return true;
    	}
        
        private void exitBy2Click(){
    		Timer tExit = null;
    		if (isExit == false) {
    			isExit = true; // 准备退出
    			Toast.makeText(this, "再按一次退出播放", Toast.LENGTH_SHORT).show();
    			tExit = new Timer();
    			tExit.schedule(new TimerTask() {
    				@Override
    				public void run() {
    					isExit = false; // 取消退出
    				}
    			}, 2000); // 如果2秒钟内没有按下返回键,则启动定时器取消掉刚才执行的任务

    		} else {
    			if (mediaPlayer != null) {
    				mediaPlayer.release();
    				mediaPlayer.reset();
    				mediaPlayer = null;
    			}
    			finish();
    		}
    	}
}

	

主要代码都有注释,没必要再做解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值