使用VideoView 或者SurfaceView 实现视频播放功能
来源:互联网 发布:mac加密ntfs 编辑:程序博客网 时间:2024/06/07 06:57
在Android中,实现视频的播放有多中方式,其中用到比较多的是使用Video View 或者是surface View来实现
1、使用Video View 实现
1.1 对应的布局文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".VideoViewActivity" > <VideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="match_parent" /> <ProgressBar android:id="@+id/progressBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:visibility="gone" /></FrameLayout>
1.2 对应的code的实现
package com.android.bootvideo;import android.app.Activity;import android.media.MediaPlayer;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.SystemProperties;import android.view.KeyEvent;import android.widget.VideoView;public class VideoViewActivity extends Activity implements MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener { private static final String TAG = "VideoViewActivity"; private Uri mUri; private VideoView mVideoView; private final int BOOT_VIDEO_LIMIT = 20 * 1000; Handler mHandler = new Handler(); private Runnable mPlayVideoRunnable = new Runnable() { @Override public void run() { XLog.d(TAG, "mPlayVideoRunnable, run()"); mHandler.removeCallbacks(mPlayVideoRunnable); XLog.v(TAG, "playVideo Current Source is storage"); playVideoSetUp(); } }; private Runnable mStopPlayVideoRunnable = new Runnable() { @Override public void run() { XLog.d(TAG, "wait 20s for bootvideo time out!"); finish(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); XLog.d(TAG, "onCreate()"); setContentView(R.layout.activity_video_view); mVideoView = (VideoView) findViewById(R.id.videoView); playVideoSetUp(); } private void playVideoSetUp() { XLog.i(TAG, "playVideoSetUp()"); String path = SystemProperties.get(Util.BOOT_VIDEO_PATH); XLog.i(TAG, "video path: " + path); if (Util.bootVideoNotExist()) { XLog.i(TAG, path + " file not exist"); return; } mUri = Uri.parse(path); mVideoView.setVideoURI(mUri); mVideoView.start(); mVideoView.setOnErrorListener(this); mVideoView.setOnCompletionListener(this); mHandler.postDelayed(mStopPlayVideoRunnable, BOOT_VIDEO_LIMIT); } private void playVideoStop() { XLog.i(TAG, "stopSetup()"); mHandler.removeCallbacks(mPlayVideoRunnable); mHandler.removeCallbacks(mStopPlayVideoRunnable); mVideoView.stopPlayback(); } @Override public void onBackPressed() { XLog.i(TAG, "onBackPressed()"); return; } @Override public boolean dispatchKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); XLog.i(TAG, "dispatchKeyEvent() keyCode = " + keyCode); switch (keyCode) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_MUTE: { return super.dispatchKeyEvent(event); } default: break; } return true; } @Override protected void onResume() { super.onResume(); XLog.d(TAG, "onResume"); } @Override protected void onPause() { XLog.d(TAG, "onPause "); super.onPause(); } @Override protected void onStart() { super.onStop(); XLog.d(TAG, "onStart"); } @Override protected void onStop() { super.onStop(); XLog.d(TAG, "onStop"); } @Override protected void onDestroy() { super.onDestroy(); playVideoStop(); XLog.d(TAG, "onDestroy"); } @Override public boolean onError(MediaPlayer mediaplay, int what, int extra) { XLog.d(TAG, "onError() framework_err " + what + " impl_err:" + extra); finish(); if (extra == MediaPlayer.MEDIA_ERROR_TIMED_OUT) { return true; } return false; } @Override public void onCompletion(MediaPlayer mediaplay) { XLog.i(TAG, "onCompletion()"); finish(); }}
2、使用surface View 实现
2.1 对应的布局文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context="com.android.bootvideo.SurfaceViewActivity" > <SurfaceView android:id="@+id/surfaceView" android:layout_width="fill_parent" android:layout_height="fill_parent" /></FrameLayout>
2.2 对应的实现
package com.android.bootvideo;import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Handler;import android.os.SystemProperties;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;public class SurfaceViewActivity extends Activity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener { private final String TAG = "MainActivity"; private SurfaceView mSurfaceView = null; private SurfaceHolder mSurfaceHolder = null; private MediaPlayer mMediaPlayer = null; private final int BOOT_VIDEO_LIMIT = 20 * 1000; Handler mHandler = new Handler(); private Runnable mStopPlayVideoRunnable = new Runnable() { @Override public void run() { XLog.d(TAG, "wait 20s for bootvideo time out!"); finish(); } }; @Override protected void onCreate(Bundle savedInstanceState) { XLog.i(TAG, "onCreate()"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_surface_view); mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(new SurfaceHolderCallback()); playVideoSetUp(); } @Override protected void onResume() { super.onResume(); XLog.i(TAG, "onResume()"); } @Override protected void onPause() { super.onPause(); XLog.i(TAG, "onPause() "); } @Override protected void onDestroy() { super.onDestroy(); playVideoStop(); XLog.i(TAG, "onDestroy()"); } @Override public boolean dispatchKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); XLog.i(TAG, "dispatchKeyEvent() keyCode = " + keyCode); switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_MUTE: { return super.dispatchKeyEvent(event); } default: break; } return true; } @Override public void onBackPressed() { XLog.i(TAG, "onBackPressed()"); return; } private void playVideoSetUp() { XLog.i(TAG, "playVideoSetUp()"); String path = SystemProperties.get(Util.BOOT_VIDEO_PATH); XLog.i(TAG, "video path: " + path); if (Util.bootVideoNotExist()) { XLog.i(TAG, path + " file not exist"); return; } try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(path); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.prepare(); mMediaPlayer.seekTo(0); mMediaPlayer.start(); } catch (Exception e) { XLog.i(TAG, "exceptipn error!"); finish(); } finally { mHandler.postDelayed(mStopPlayVideoRunnable, BOOT_VIDEO_LIMIT); } } private void playVideoStop() { XLog.i(TAG, "stopSetup()"); mHandler.removeCallbacks(mStopPlayVideoRunnable); mMediaPlayer.stop(); } private class SurfaceHolderCallback implements SurfaceHolder.Callback { @Override public void surfaceCreated(SurfaceHolder holder) { XLog.i(TAG, "surfaceCreated()"); mMediaPlayer.setDisplay(holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { XLog.i(TAG, "surfaceChanged()"); } @Override public void surfaceDestroyed(SurfaceHolder holder) { XLog.i(TAG, "surfaceDestroyed()"); } } @Override public void onPrepared(MediaPlayer player) { XLog.i(TAG, "onPrepared()"); int width = player.getVideoWidth(); int height = player.getVideoHeight(); XLog.i(TAG, "with = " + width + ",height = " + height); // mSurfaceView.setLayoutParams(new LinearLayout.LayoutParams(width, height)); } @Override public void onCompletion(MediaPlayer player) { XLog.i(TAG, "onCompletion()"); finish(); } @Override public boolean onError(MediaPlayer player, int whatError, int extra) { XLog.i(TAG, "onError() whatError = " + whatError); finish(); return false; }}
3、 对应的 source code
Media player
阅读全文
0 0
- 使用VideoView 或者SurfaceView 实现视频播放功能
- Android视频播放框架Vitamio集成及使用MediaPlayer+SurfaceView、VideoView+MediaController实现播放网络视频
- 使用videoview实现播放视频
- VideoView和SurfaceView播放视频
- VideoView和SurfaceView视频播放
- 视频播放器videoview surfaceview
- Android中VideoView及SurfaceView视频播放实现
- 使用SurFaceView实现视频播放
- 使用surfaceView实现视频播放
- 使用VideoView实现简单视频播放器
- 使用VideoView实现简单视频播放器
- 使用VideoView实现视频轮番播放
- 使用VideoView+MediaController实现视频播放器
- videoview实现视频播放
- videoview实现视频播放
- SurfaceView + MediaPlayer 实现视频播放功能
- 使用VideoView播放视频
- 使用VideoView播放视频
- Android Studio导入Eclipse项目
- 漏洞--Struts2远程命令执行S2-016
- Android7.0相机兼容处理方法
- 11.20第十三课
- Unsupported major.minor version 52.0
- 使用VideoView 或者SurfaceView 实现视频播放功能
- MySQL命令
- linux下面文件的一些基本操作
- 目标检测之二(传统算法和深度学习的源码学习)
- IF判断括号区别
- c#中public,private,protected,internal的区别
- 使用POI读写word docx文件
- Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python
- RecyclerView实现瀑布流的效果