MediaPlayer_视频播放器

来源:互联网 发布:java extends super 编辑:程序博客网 时间:2024/04/29 13:20
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text" />
    <EditText
        android:id="@+id/music"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="a.mp4"
         />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
         <Button
        android:id="@+id/playbut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/play"
        android:onClick="onClick"
       />
          <Button
        android:id="@+id/pausebut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/pause"
        android:onClick="onClick"
      />
           <Button
        android:id="@+id/respalybut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/replay"
        android:onClick="onClick"
         />
            <Button
        android:id="@+id/shopbut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/shop"
        android:onClick="onClick"
         />
    </LinearLayout>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        >
        
        <SurfaceView
            android:id="@+id/surfaceview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="200"
            />
      <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <SeekBar
            android:id="@+id/seekBar1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="20"
             />
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
         </LinearLayout>
        
    </LinearLayout>

</LinearLayout>




package com.examplemediaplayer;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private EditText pathText;
    private SurfaceView surfaceView;
    private MediaPlayer mediaPlayer;
    private String path;
    private Button pausebut;
    private int position;
    private SeekBar seekBar;
    private TextView text;
    private boolean isplay;  //正在播放的标记
    private boolean shopNotProgress = true;
    
    
    
    private Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            if(msg.what==1){
                String s=(String) msg.obj;
                text.setText(s);
            }
        }
        
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mediaPlayer = new MediaPlayer();//实例化MediaPlayer
        pathText=(EditText) findViewById(R.id.music);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        pausebut = (Button) findViewById(R.id.pausebut);
        seekBar = (SeekBar) findViewById(R.id.seekBar1);
        text=(TextView) findViewById(R.id.text);
        
        //把输送给sufaceview的视频画面,直接显示到屏幕上,不要维持它自身的缓冲区
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        //设置视频分辨率
        surfaceView.getHolder().setFixedSize(176, 144);
        surfaceView.getHolder().setKeepScreenOn(true);//保持屏幕不锁屏
        //当SurfaceView所在的Activity离开了前台,SurfaceView会被destory,执行surfaceDestroyed()方法
        //当Ativity又重新回到前台时,SurfaceView会被重新新建,调用surfaceChanged和surfaceCreated方法
        //如果不在surfaceCreated方法中调用播放方法的话,Ativity重新回到前台,SurfaceView无法播放视频
        //因为mediaPlayer.setDisplay(surfaceView.getHolder()); 中的surfaceView.getHolder()已经被变化了
        surfaceView.getHolder().addCallback(new MyCallback());
        
        seekBar.setOnSeekBarChangeListener(new MySeekBarChangeListener());
    }

    private final class MyCallback implements SurfaceHolder.Callback{

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            if(position>0&&path!=null){
                play(position);
                position=0;
            }
            
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if(mediaPlayer.isPlaying()){
                position=mediaPlayer.getCurrentPosition();
                mediaPlayer.stop();
            }
            
        }
        
    }
    /**
     * 按钮触发方法
     * @param view
     */
    public void onClick(View view){
        switch(view.getId()){
        case R.id.playbut:
            play(position);
            break;
        case R.id.pausebut:
            pause();
            break;
        case R.id.respalybut:
            replayer();
            break;
        case R.id.shopbut:
            shop();
            break;
        }
    }

    private void shop() {
        if(mediaPlayer.isPlaying()){
            mediaPlayer.stop();
            shopNotProgress=false;
            isplay=false;
        }
        
    }

    private void replayer() {
        if(mediaPlayer.isPlaying()){
            mediaPlayer.seekTo(0);
        }else{
            if(path!=null){
                play(0);
            }
        }
        
    }

    private void pause() {
        String title=pausebut.getText().toString();
        if("暂停".equals(title)){
            if(mediaPlayer.isPlaying()){
                mediaPlayer.pause();
                position=mediaPlayer.getCurrentPosition();
            }
            pausebut.setText("继续");
        }else if("继续".equals(title)){
            mediaPlayer.start();
            pausebut.setText("暂停");
        }
        
    }

    private void play(int position) {
        String mv = pathText.getText().toString();
        File file = new File(Environment.getExternalStorageDirectory(), mv);
        if(file.exists()){
            path=file.getAbsolutePath(); //获取视频
            //path="http://192.168.144.1:8080/WEB/a.mp4";
            try{
            mediaPlayer.reset();//从设置
            mediaPlayer.setDataSource(path); //设置视频资源
            mediaPlayer.setDisplay(surfaceView.getHolder());//设置显示视频
            mediaPlayer.prepare();//缓冲
            mediaPlayer.setOnPreparedListener(new PreparedListener(position));//监听缓冲是否完成
            
            }catch(Exception e){
                e.printStackTrace();
            }
            
        }else{
            Toast.makeText(MainActivity.this, "视频不存在", 2).show();
        }
        
    }
    
    /**
     * 缓冲监听类
     * @author olay
     *
     */
    public final class PreparedListener implements MediaPlayer.OnPreparedListener{
        int position;
        public  PreparedListener(int position){
            this.position=position;
        }

        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaPlayer.start();
            
            final long max=mediaPlayer.getDuration(); //得到视频的总长度(毫秒)
             final String time = converLongTimeToStr(max); //得到mm:ss格式的时长的字符串
             seekBar.setMax((int)max); //设置进度条的总长度
            new Thread(){
                public void run(){
                    isplay=true;
                    while(isplay){  //是否正在播放
                         int current=mediaPlayer.getCurrentPosition();  //获取当前播放的时间
                         seekBar.setProgress(current);  //设置进度条的进度
                        
                            String reaplay=converLongTimeToStr(current); //当前播放时间格式
                            Message msg = new Message();
                            msg.what=1;
                            msg.obj=reaplay+"/"+time;
                            handler.sendMessage(msg);
                    }
                    
                }
            }.start();
            
            
            if(position>0){
                mediaPlayer.seekTo(position);
            }
            
        }
        
        
        
        
        
        /**
         * 毫秒转换 mm:ss格式方法
         * @param max
         * @return
         */
        public String converLongTimeToStr(long time) {
            int ss = 1000;
            int mi = ss * 60;
            int hh = mi * 60;
    
            long hour = (time) / hh;
            long minute = (time - hour * hh) / mi;
            long second = (time - hour * hh - minute * mi) / ss;
    
            String strHour = hour < 10 ? "0" + hour : "" + hour;
            String strMinute = minute < 10 ? "0" + minute : "" + minute;
            String strSecond = second < 10 ? "0" + second : "" + second;
            if (hour > 0) {
                return strHour + ":" + strMinute + ":" + strSecond;
            } else {
                return strMinute + ":" + strSecond;
            }
        }

        
    }

    /**
     * 进度条监听类
     * @author olay
     *
     */
     public final class MySeekBarChangeListener implements OnSeekBarChangeListener{

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

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
                
            }
            
            /**
             * 手动拉进度条,当进度条触摸拉动停止时,调用次方法
             */
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int position = seekBar.getProgress();  //获取当前进度条的进度
                if(mediaPlayer!=null&&shopNotProgress){
                    play(position);  //播放
                }
                
            }
            
        }
}