您的位置:首页 > 移动开发 > Android开发

Android中使用SurfaceView视频播放器

2015-09-03 15:25 375 查看
public class PlayerVideoActivity extends Activity {  
  
    // SurfaceView控件  
    private SurfaceView sv_video;  
  
    private SurfaceHolder surfaceHolder;  
  
    // 播放视频对象  
    private MediaPlayer mediaPlayer;  
  
    private String path;  
  
    private boolean PasueFlag = false;  
  
    // 记录暂停播放的位置  
    private int currentPosition = 0;  
  
    // 播放按钮的控件  
    private LinearLayout video_layout;  
      
    //声明一个回放的记录位置  
    private int backPosition = 0;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_video);  
        // 获取SurfaceView控件  
        sv_video = (SurfaceView) findViewById(R.id.sv_video);  
  
        // 通过控件来获取SurfaceHolder  
        surfaceHolder = sv_video.getHolder();  
  
        // 回调函数  
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {  
  
            // surfaceView控件被销毁的方法  
            @Override  
            public void surfaceDestroyed(SurfaceHolder holder) {  
                // 当点击后退按钮 就杀死 surfaceView控件 activity被杀死  
                  
                //记录视频所播放的位置  
                int position = mediaPlayer.getCurrentPosition();  
                mediaPlayer.release();  
                mediaPlayer = null;  
                  
                //声明意图对象  
                Intent data = new Intent();  
                data.putExtra("position",position);  
                PlayerVideoActivity.this.setResult(RESULT_OK, data);  
                  
                //当前kill  
                PlayerVideoActivity.this.finish();  
            }  
  
            // surfaceView创建的时候执行的方法  
            @Override  
            public void surfaceCreated(SurfaceHolder holder) {  
                // 当第一次使用SurfaceView的时候 播放视频  
                play();  
            }  
  
            // surfaceView发生变化执行的操作  
            @Override  
            public void surfaceChanged(SurfaceHolder holder, int format,  
                    int width, int height) {  
  
            }  
        });  
  
        // 在这里怎么获取intent传递的数据  
        path = this.getIntent().getStringExtra("path");  
        backPosition = this.getIntent().getIntExtra("position", 0);  
  
        // 获取LinearLayout的对象  
        video_layout = (LinearLayout) findViewById(R.id.video_layout);  
  
        // 隐藏  
        video_layout.setVisibility(View.GONE);  
    }  
  
    public void playerVideo(View v) {  
        play();// 播放视频  
    }  
  
    // 视频播放的操作  
    public void play() {  
  
        if (PasueFlag) {  
            if (mediaPlayer != null) {  
                // 跳转到播放记录的位置  
                mediaPlayer.seekTo(currentPosition);  
                mediaPlayer.start();  
            }  
            // 变为false  
            PasueFlag = false;  
        } else {  
            // 判断视频 是否为播放状态  
            if (mediaPlayer != null) {  
                if (mediaPlayer.isPlaying()) {  
                    System.out.println("视频处于播放状态");  
                }  
            } else {  
                // 传递的路径 是否为空  
                if (path != null) {  
                    try {  
  
                        // 创建视频播放的对象  
                        mediaPlayer = new MediaPlayer();  
  
                        /** 
                         * 视频播放完成出发的事件 
                         */  
                        mediaPlayer  
                                .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  
  
                                    @Override  
                                    public void onCompletion(MediaPlayer mp) {  
                                        mediaPlayer.release();  
                                        mediaPlayer = null;  
                                        System.out.println(mediaPlayer  
                                                + "------------onCompletion"  
                                                + mp);  
  
                                    }  
                                });  
  
                        /** 
                         * 播放出差错的时候触发的事件 
                         *  
                         * 回调函数 
                         */  
                        mediaPlayer  
                                .setOnErrorListener(new MediaPlayer.OnErrorListener() {  
  
                                    @Override  
                                    public boolean onError(MediaPlayer mp,  
                                            int what, int extra) {  
                                        mediaPlayer.release();  
                                        mediaPlayer = null;  
                                        return false;  
                                    }  
                                });  
  
                        // 设计音频流类型  
                        mediaPlayer  
                                .setAudioStreamType(AudioManager.STREAM_MUSIC);  
  
                        // 指定播放的文件  
                        mediaPlayer.setDataSource(path);  
                        // 指定用于播放视频的SurfaceView的控件  
                        mediaPlayer.setDisplay(surfaceHolder);  
                        mediaPlayer.prepare();  
                          
                        //记录上次播放的位置  
                        mediaPlayer.seekTo(backPosition);  
                        mediaPlayer.start();  
  
                        PasueFlag = false;  
  
                    } catch (IOException e) {  
  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
  
    }  
  
    public void pasueVideo(View v) {  
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
            mediaPlayer.pause();  
            // 记录这个位置  
            currentPosition = mediaPlayer.getCurrentPosition();  
            // 标识 这视频 会被暂停  
            PasueFlag = true;  
        }  
  
    }  
  
    public void stopVideo(View v) {  
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
            mediaPlayer.stop();  
            mediaPlayer.release();  
            mediaPlayer = null;  
            // 暂停标识  
            PasueFlag = false;  
        }  
  
    }  
  
    public void resetVideo(View v) {  
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
            mediaPlayer.seekTo(0);  
            mediaPlayer.start();  
        }  
  
    }  
  
    // 触摸事件  
    public boolean onTouchEvent(MotionEvent event) {  
        // 获取布局对象是否是隐藏  
        if (View.GONE == video_layout.getVisibility()) {  
            video_layout.setVisibility(View.VISIBLE);// 显示  
        } else {  
            video_layout.setVisibility(View.GONE);// 隐藏  
        }  
        return super.onTouchEvent(event);  
    }  
      
  
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.player_video, menu);  
        return true;  
    }  
  
    /* 
     * protected void onDestroy() { super.onDestroy(); // 释放资源 if (mediaPlayer 
     * != null) { mediaPlayer.release(); mediaPlayer = null; } } 
     */  
  
}  

[java]
view plaincopy

public class VideoActivity extends Activity {  
  
    private static final int VIDEOREQUESTPLAYER = 1;  
    private int position = 0;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_list);  
    }  
  
    public void player(View v) {  
        Intent intent = new Intent(VideoActivity.this,  
                PlayerVideoActivity.class);  
        File sdCardFile = Environment.getExternalStorageDirectory();  
        String path = sdCardFile.getPath() + "/Music/oppo.3gp";  
        intent.putExtra("path", path);  
        intent.putExtra("position", position);  
        startActivityForResult(intent, VIDEOREQUESTPLAYER);  
    }  
  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        super.onActivityResult(requestCode, resultCode, data);  
  
        System.out.println("-------------------onActivityResult");  
        // 判断是否是这个请求  
        if (VIDEOREQUESTPLAYER == requestCode) {  
            // 判断这个请求的响应吗是否成功  
            if (RESULT_OK == resultCode) {  
                position = data.getIntExtra("position", 0);  
                System.out.println("==========================" + position);  
            }  
  
        }  
    }  
  
}  

[java]
view plaincopy

<SurfaceView  
        android:id="@+id/sv_video"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true" />  
  
    <LinearLayout  
        android:id="@+id/video_layout"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_alignParentBottom="true"  
        android:layout_alignParentLeft="true"  
        android:gravity="center_horizontal"  
        android:orientation="horizontal"  
        tools:ignore="UselessParent" >  
  
        <Button  
            android:id="@+id/button1"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:onClick="playerVideo"  
            android:text="@string/btn_play" />  
  
        <Button  
            android:id="@+id/button2"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:onClick="pasueVideo"  
            android:text="@string/btn_pasue" />  
  
        <Button  
            android:id="@+id/button3"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:onClick="stopVideo"  
            android:text="@string/btn_stop" />  
  
        <Button  
            android:id="@+id/button4"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:onClick="resetVideo"  
            android:text="@string/btn_reset" />  
    </LinearLayout> 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android