Android_视频播放功能

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.SurfaceHolder.Callback;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

public class PlayActivity extends Activity {

    private static final String TAG = "PlayActivity";

    private EditText filenameText;

    private MediaPlayer mediaPlayer;

    private SurfaceView surfaceView;

    private String filename;
    
    private int position;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        filenameText = (EditText) this.findViewById(R.id.filename);

        surfaceView = (SurfaceView) this.findViewById(R.id.serfaceView);

        // 设置分辨率
        surfaceView.getHolder().setFixedSize(176, 144);

        // 设置surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
        surfaceView.getHolder()
                .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        
        surfaceView.getHolder().addCallback(new SurfaceCallback());

        mediaPlayer = new MediaPlayer();

        ButtonClickListener listener = new ButtonClickListener();

        ImageButton playBtn = (ImageButton) this.findViewById(R.id.play);
        ImageButton pauseBtn = (ImageButton) this.findViewById(R.id.pause);
        ImageButton resetBtn = (ImageButton) this.findViewById(R.id.reset);
        ImageButton stopBtn = (ImageButton) this.findViewById(R.id.stop);

        playBtn.setOnClickListener(listener);
        pauseBtn.setOnClickListener(listener);
        resetBtn.setOnClickListener(listener);
        stopBtn.setOnClickListener(listener);
    }

    @Override
    protected void onPause() {
        
        super.onPause();
        
    }
    
    @Override
    protected void onResume() {
        
        super.onResume();
        
    }
    
    private final class ButtonClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {

            if (!Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED)) {

                Toast.makeText(PlayActivity.this, R.string.sdcarderror,
                        Toast.LENGTH_LONG).show();

                return;
            }

            filename = filenameText.getText().toString();

            try {
                switch (v.getId()) {

                case R.id.play:

                    play();

                    break;

                case R.id.pause:

                    if (mediaPlayer.isPlaying()) {
                        // 暂停播放
                        mediaPlayer.pause();
                    } else {
                        // 继续播放
                        mediaPlayer.start();
                    }

                    break;

                case R.id.reset:

                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.seekTo(0);
                    } else {
                        play();
                    }

                    break;

                case R.id.stop:

                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.stop();
                    }

                    break;

                default:
                    break;
                }
            } catch (Exception e) {
                Log.e(TAG, e.toString());
            }

        }

    }

    private final class SurfaceCallback implements Callback {

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            
        }

        /**
         * 在SurfaceView创建的时候调用该方法
         */
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            
            if(position > 0 && filename != null) {
                try {
                    play();
                    mediaPlayer.seekTo(position);
                    position = 0;
                } catch (IOException e) {
                    Log.e(TAG, e.toString());
                }
            }
        }

        /**
         * 在SurfaceView销毁的时候调用该方法
         */
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            
            if(mediaPlayer.isPlaying()) {
                
                position = mediaPlayer.getCurrentPosition();
                
                mediaPlayer.stop();
            }
        }
        
    }
    
    private void play() throws IOException {

        File vedioFile = new File(Environment.getExternalStorageDirectory(),
                filename);
        
        Log.i(TAG, vedioFile.getAbsolutePath());
        
        // 重置为初始状态
        mediaPlayer.reset();

        // 设置音频流的类型
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        // 设置vedio影片以SurfaceHolder播放
        mediaPlayer.setDisplay(surfaceView.getHolder());

        // 设置vedio文件路径
        //mediaPlayer.setDataSource(vedioFile.getAbsolutePath());
        
        FileInputStream fis = new FileInputStream(vedioFile.getAbsolutePath());
        
        mediaPlayer.setDataSource(fis.getFD());

        // 缓冲
        //mediaPlayer.prepare();
        mediaPlayer.prepareAsync();

        // 开始播放
        mediaPlayer.start();
    }

}
posted @ 2012-06-27 00:34  雪中飞雁  阅读(134)  评论(0)    收藏  举报