转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/39471397

VideoView内部封装好了Mediaplayer.Android框架提供了VideoView类来封装MediaPalyer,这个VideoView类非常好用。Android自带的程序Gallery也是用VideoView实现的。相比之下,我们使用更方便 ,实现MediaPlayer.OnCompletionListener接口,将会在Video播完的时候得到通知,本例只是简单的结束程序如下:

另附我的一个还未成熟的播放器,下载地址:http://www.eoemarket.com/soft/370334.html,正在完善中


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.Display;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;public class VideoPlayerActivity extends Activity implements OnCompletionListener {private String mPath;private String mTitle;private VideoView mVideoView;private View mVolumeBrightnessLayout;private ImageView mOperationBg;private ImageView mOperationPercent;private AudioManager mAudioManager;/** 最大声音 */private int mMaxVolume;/** 当前声音 */private int mVolume = -1;/** 当前亮度 */private float mBrightness = -1f;/** 当前缩放模式 */private int mLayout = VideoView.VIDEO_LAYOUT_ZOOM;private GestureDetector mGestureDetector;private MediaController mMediaController;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);Intent intent = getIntent();mPath = intent.getStringExtra("path");mTitle = intent.getStringExtra("title");if (TextUtils.isEmpty(mPath))mPath = Environment.getExternalStorageDirectory() + "/video/你太猖狂.flv";else if (intent.getData() != null)mPath = intent.getData().toString();setContentView(R.layout.videoview);mVideoView = (VideoView) findViewById(R.id.surface_view);mVolumeBrightnessLayout = findViewById(R.id.operation_volume_brightness);mOperationBg = (ImageView) findViewById(R.id.operation_bg);mOperationPercent = (ImageView) findViewById(R.id.operation_percent);mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);if (mPath.startsWith("http:"))mVideoView.setVideoURI(Uri.parse(mPath));elsemVideoView.setVideoPath(mPath);//mVideoView.setOnCompletionListener(this);mMediaController = new MediaController(this);//设置显示名称mMediaController.setFileName(mTitle);mVideoView.setMediaController(mMediaController);mVideoView.requestFocus();mGestureDetector = new GestureDetector(this, new MyGestureListener());setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}@Overrideprotected void onPause() {super.onPause();if (mVideoView != null)mVideoView.pause();}@Overrideprotected void onResume() {super.onResume();if (mVideoView != null)mVideoView.resume();}@Overrideprotected void onDestroy() {super.onDestroy();if (mVideoView != null)mVideoView.stopPlayback();}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (mGestureDetector.onTouchEvent(event))return true;// 处理手势结束switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_UP:endGesture();break;}return super.onTouchEvent(event);}/** 手势结束 */private void endGesture() {mVolume = -1;mBrightness = -1f;// 隐藏mDismissHandler.removeMessages(0);mDismissHandler.sendEmptyMessageDelayed(0, 500);}private class MyGestureListener extends SimpleOnGestureListener {/** 双击 */@Overridepublic boolean onDoubleTap(MotionEvent e) {if (mLayout == VideoView.VIDEO_LAYOUT_ZOOM)mLayout = VideoView.VIDEO_LAYOUT_ORIGIN;elsemLayout++;if (mVideoView != null)mVideoView.setVideoLayout(mLayout, 0);return true;}/** 滑动 */@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {float mOldX = e1.getX(), mOldY = e1.getY();int y = (int) e2.getRawY();Display disp = getWindowManager().getDefaultDisplay();int windowWidth = disp.getWidth();int windowHeight = disp.getHeight();if (mOldX > windowWidth * 4.0 / 5)// 右边滑动onVolumeSlide((mOldY - y) / windowHeight);else if (mOldX < windowWidth / 5.0)// 左边滑动onBrightnessSlide((mOldY - y) / windowHeight);return super.onScroll(e1, e2, distanceX, distanceY);}}/** 定时隐藏 */private Handler mDismissHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {mVolumeBrightnessLayout.setVisibility(View.GONE);}};/*** 滑动改变声音大小* * @param percent*/private void onVolumeSlide(float percent) {if (mVolume == -1) {mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);if (mVolume < 0)mVolume = 0;// 显示mOperationBg.setImageResource(R.drawable.video_volumn_bg);mVolumeBrightnessLayout.setVisibility(View.VISIBLE);}int index = (int) (percent * mMaxVolume) + mVolume;if (index > mMaxVolume)index = mMaxVolume;else if (index < 0)index = 0;// 变更声音mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);// 变更进度条ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume;mOperationPercent.setLayoutParams(lp);}/*** 滑动改变亮度* * @param percent*/private void onBrightnessSlide(float percent) {if (mBrightness < 0) {mBrightness = getWindow().getAttributes().screenBrightness;if (mBrightness <= 0.00f)mBrightness = 0.50f;if (mBrightness < 0.01f)mBrightness = 0.01f;// 显示mOperationBg.setImageResource(R.drawable.video_brightness_bg);mVolumeBrightnessLayout.setVisibility(View.VISIBLE);}WindowManager.LayoutParams lpa = getWindow().getAttributes();lpa.screenBrightness = mBrightness + percent;if (lpa.screenBrightness > 1.0f)lpa.screenBrightness = 1.0f;else if (lpa.screenBrightness < 0.01f)lpa.screenBrightness = 0.01f;getWindow().setAttributes(lpa);ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness);mOperationPercent.setLayoutParams(lp);}@Overridepublic void onConfigurationChanged(Configuration newConfig) {if (mVideoView != null)mVideoView.setVideoLayout(mLayout, 0);super.onConfigurationChanged(newConfig);}@Overridepublic void onCompletion(MediaPlayer player) {finish();}
}

videoView 是android 系统提供的一个媒体播放显示和控制的控件。其结构层次如下:

  原型:VideoView extends SurfaceView implements MediaController.MediaPlayerControl

  类结构:

      java.lang.Object
        ↳ android.view.View
          ↳ android.view.SurfaceView
            ↳ android.widget.VideoView

  通过VideoView 的原型可知:如果构建更为复杂和有特色个性的视频View,需要继承SurfaceView 和实现MediaPlayerControl接口。其中SurfaceView 为显示提供支持,MediaPlayerControl则为媒体控制提供了支持。

核心播放类:

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class PlayerActivity extends Activity implements OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {private static final String TAG = "MediaPlayerDemo";private int mVideoWidth;private int mVideoHeight;private MediaPlayer mMediaPlayer;private SurfaceView mPreview;private SurfaceHolder holder;private String path = Environment.getExternalStorageDirectory() + "/Moon.mp4";private boolean mIsVideoSizeKnown = false;private boolean mIsVideoReadyToBePlayed = false;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.mediaplayer);mPreview = (SurfaceView) findViewById(R.id.surface);holder = mPreview.getHolder();holder.addCallback(this);}private void playVideo() {doCleanUp();try {mMediaPlayer = new MediaPlayer(this);mMediaPlayer.setDataSource(path);mMediaPlayer.setDisplay(holder);mMediaPlayer.prepareAsync();mMediaPlayer.setScreenOnWhilePlaying(true);mMediaPlayer.setOnBufferingUpdateListener(this);mMediaPlayer.setOnCompletionListener(this);mMediaPlayer.setOnPreparedListener(this);mMediaPlayer.setOnVideoSizeChangedListener(this);} catch (Exception e) {Log.e(TAG, "error: " + e.getMessage(), e);}}@Overridepublic void onBufferingUpdate(MediaPlayer arg0, int percent) {Log.d(TAG, "onBufferingUpdate percent:" + percent);}@Overridepublic void onCompletion(MediaPlayer arg0) {Log.d(TAG, "onCompletion called");mMediaPlayer.release();}@Overridepublic void onVideoSizeChanged(MediaPlayer mp, int width, int height) {Log.v(TAG, "onVideoSizeChanged called");if (width == 0 || height == 0) {Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");return;}mIsVideoSizeKnown = true;mVideoWidth = width;mVideoHeight = height;if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {startVideoPlayback();}}@Overridepublic void onPrepared(MediaPlayer mediaplayer) {Log.d(TAG, "onPrepared called");mIsVideoReadyToBePlayed = true;if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {startVideoPlayback();}}@Overridepublic void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {Log.d(TAG, "surfaceChanged called" + i + "  " + j + "   " + k);}@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceholder) {Log.d(TAG, "surfaceDestroyed called");}@Overridepublic void surfaceCreated(SurfaceHolder holder) {Log.d(TAG, "surfaceCreated called");playVideo();}@Overrideprotected void onPause() {super.onPause();releaseMediaPlayer();doCleanUp();}@Overrideprotected void onDestroy() {super.onDestroy();releaseMediaPlayer();doCleanUp();}private void releaseMediaPlayer() {if (mMediaPlayer != null) {mMediaPlayer.release();mMediaPlayer = null;}}private void doCleanUp() {mVideoWidth = 0;mVideoHeight = 0;mIsVideoReadyToBePlayed = false;mIsVideoSizeKnown = false;}private void startVideoPlayback() {Log.v(TAG, "startVideoPlayback");holder.setFixedSize(mVideoWidth, mVideoHeight);mMediaPlayer.start();}
}

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码,即可关注。 

使用VideoView实现简单视频播放器相关推荐

  1. android 实现视频播放功能,android开发之简单视频播放器(VideoView)

    简单视频播放器的使用 一.简单使用videoView和MediaController实现播放控制 1.添加需要的权限 2.设置布局 android:id="@+id/main_video&q ...

  2. Opencv 简单视频播放器

    最近看了一下[1]_2011_OpenCV 2 Computer Vision Application Programming Cookbook.pdf,写了一个利用Opencv库实现的简单视频播放器 ...

  3. android关于VideoView或Vitamio视频播放器横竖屏切换

    之前在网上寻求帮助时,留有QQ,好多人加我问过这个问题,现在为了方便大家,我将android关于VideoView或Vitamio视频播放器横竖屏切换的代码放在这里需要的朋友可以看一下,当然我做的这个 ...

  4. Android Studio——简单视频播放器

    1.界面分析 三个界面:主界面,视频列表界面,视频播放界面,如下图所示: 2.实现思路 (1)主界面设计 很简单,就一个背景和一个控件,然后为控件设置点击事件,然后跳转到视频列表界面 activity ...

  5. 轻松玩转Python:打开文件夹,搜索视频文件,实现简单视频播放器

    目录 1.功能描述: 2.具体实现: 3.代码实现: 4.执行效果: 1.功能描述: 这段代码实现了一个简单的视频播放器,可以打开指定的文件夹并搜索其中的视频文件,将搜索结果展示在列表框中,用户可以选 ...

  6. PyQt5 简单视频播放器

    文章目录 1.主要组件 2.功能代码 3.功能展示 4.如果播放不了 1.主要组件 QVideoWidget:这个类主要用作播放视频的控件 QMediaPlayer :实现媒体播放的类 2.功能代码 ...

  7. <Python>PyQt5+ffmpeg,简单视频播放器的编写(解码器:K-lite)

    更新日志: 202211251640:第一版,基本功能:视频导入,播放.暂停.播放时间显示.音量控制 视频播放器 概述:本文是利用PyQt5加上ffmpeg来编写一个具备基本功能的视频播放器(播放.暂 ...

  8. 原生h5+css3 实现简单视频播放器组件

    视频播放器组件案例 实现效果 实现功能 全屏切换 进度条点击跳播 音量点击设置大小 涉及知识点 video对象属性 .duration 获取视频总长度(秒) .currentTime 当前播放时间(秒 ...

  9. SDL,ffmpeg实现简单视频播放器

    看了雷神的一些文章和解释,自己重新实现了一下相关代码的东西,做为加深. 一起在音视频领域加油咯! // 基于FFmpeg用SDL实现一个视频播放器(.h264) ///* AVFormatContex ...

  10. 学雷前辈暑期小学期课简单视频播放器制作笔记(二)

    因为论文的方向分了(是的,是分的,不是自己选的,个中原因一言难尽.研究生毕设,刚开始,12月份答辩,之前做的全是内容开发,虽然很绝望但是还是要一点点做,论文方向是HEVC的编码优化,目前没啥思路,看了 ...

最新文章

  1. 视频码率,帧率和分辨率的联系与差别
  2. windows7下redis的安装实践
  3. 上传excel,并保存excel内容
  4. python模拟火车订票系统代码_100行Python代码实现自动抢火车票
  5. debug 技巧 包括各种场景的debug方法
  6. IDEA git 切换分支产生问题
  7. Blender建模练习:人物模型多边形建模流程图解(三 衣服篇)
  8. 无损内嵌字幕到mkv文件
  9. 【云售前工具】在线绘图工具推荐
  10. 学习新方法:帅到没朋友
  11. 去中心化身份 DID( Decentralized Identifiers)
  12. Zbar源码解析——zbar_oho_条形码阅读器|2021SC@SDUSC
  13. 如何在Office 365中使用Office剪贴板?
  14. Axure下拉框的多选与取消
  15. IOS error:Images.xcassets: error: ERROR: Each TDDistiller instance can be distilled only one time!
  16. 2017年10月WEB前端开发实习生面试题总结
  17. 微服务拆分原则之 AKF
  18. 通过 WebRTC 共享屏幕很容易
  19. 传智播客100万现金奖励优秀校友
  20. 申请阿里云免费版SSL证书并配置在宝塔Nginx上

热门文章

  1. c语言课设代写一般多少钱_海南彩礼钱一般给多少 海南娶媳妇要多少钱
  2. 图像语义分割(7)-PSPNet:金字塔型场景解析网络
  3. Delphi Sysem.JSON 链式写法(转全能中间件)
  4. 【视频】超级账本HyperLedger:Fabric源码走读(一):项目构建与代码结构
  5. STL之string
  6. C# 访问数据的时候报错 (拒绝了对对象 'XXXX' (数据库 'SHQY',架构 'dbo')的 SELECT 权限)...
  7. OS开发(Objective-C)常用库索引
  8. Linux Shell编程(25)——I/O 重定向
  9. 什么是基金前端收费和后端收费
  10. 【LeetCode】【字符串】题号:*14. 最长公共前缀