Android多媒体之VideoView视频播放器

本文实例为大家分享了视频播放器的两种方式,供大家参考,具体内容如下

1)、SurfaceView
在布局文件中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_media_play"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:orientation="vertical"
 tools:context="com.zking.android_contentresolve.MediaPlayActivity">

 <SurfaceView
  android:layout_width="match_parent"
  android:layout_height="300dp"
  android:id="@+id/sv_media_surface"
  />

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  >
  <SeekBar
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:id="@+id/seekBar"
   android:layout_weight="1" />

  <ImageButton
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:src="@android:drawable/ic_media_play"
   android:onClick="isPlayOrPause"
   />
 </LinearLayout>
</LinearLayout>

在Activity里面和播放内存卡上音乐的代码差不多,只是视频多了个显示内容,关键代码就是这三条

//播放内存上的视频
mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/Movies/sister.mp4"));

//准备(内存卡)
mediaPlayer.prepare();

//将媒体播放器捕捉的画面展示在SurfaceView 上
mediaPlayer.setDisplay(sv_media_surface.getHolder());

但是没看前面博客的筒子可能会觉得看不懂,所以还是把完整的代码粘贴出来

public class MediaPlayActivity extends AppCompatActivity {
 private SeekBar seekBar;
 private MediaPlayer mediaPlayer;
 private SurfaceView sv_media_surface;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_media_play);
  seekBar = (SeekBar) findViewById(R.id.seekBar);
  sv_media_surface = (SurfaceView) findViewById(R.id.sv_media_surface);

  seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
   @Override
   public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

   }

   @Override
   public void onStartTrackingTouch(SeekBar seekBar) {

   }

   @Override
   public void onStopTrackingTouch(SeekBar seekBar) {
    //获取拖动结束后的位置
    int progress=seekBar.getProgress();
    //跳转到某个位置播放
    mediaPlayer.seekTo(progress);
   }
  });
 }

 public void isPlayOrPause(View view){
  final ImageButton imageButton= (ImageButton) view;

  if(mediaPlayer==null){//代表第一次播放音乐

   //播放内存卡内的音频
   mediaPlayer=new MediaPlayer();
   //设置类型
   mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
   //设置音源
   try {
    //播放内存上的视频
    mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/Movies/sister.mp4"));
    //准备(内存卡)
    mediaPlayer.prepare();

    //将媒体播放器捕捉的画面展示在SurfaceView 上
    mediaPlayer.setDisplay(sv_media_surface.getHolder());

    //必须在播放前加载音频文件(异步准备)
//    mediaPlayer.prepareAsync();

   } catch (IOException e) {
    e.printStackTrace();
   }

   mediaPlayer.start();
   //把图标改成暂停的图标(这里的暂停图标就是播放时的状态)
   imageButton.setImageResource(android.R.drawable.ic_media_pause);

   //获取音乐的总时长
   int duration=mediaPlayer.getDuration();
   //设置进度条的最大值为音乐的总时长
   seekBar.setMax(duration);

   new MyThread();
  }else if(mediaPlayer.isPlaying()){//正在播放音乐
   mediaPlayer.pause();
   //把图标改成播放的图标(暂停状态)
   imageButton.setImageResource(android.R.drawable.ic_media_play);
  }else{
   mediaPlayer.start();
   imageButton.setImageResource(android.R.drawable.ic_media_pause);
  }

 }

 class MyThread extends Thread{
  @Override
  public void run() {
   super.run();
   while(seekBar.getProgress()<seekBar.getMax()){
    //获取当前音乐播放的位置
    int currentPosition=mediaPlayer.getCurrentPosition();
    //让进度条跟着时间走
    seekBar.setProgress(currentPosition);

   }
  }
 }

}

2)、VideoView,如果在项目中,仅仅只是播放视频的话,这种方式会比较简单,但是如果是要做视频播放器的话,还是使用第一种方法

布局文件

 <VideoView
  android:layout_width="match_parent"
  android:layout_height="300dp"
  android:id="@+id/vv_main_vedio"
  />

Activity

public class VedioActivity extends AppCompatActivity {

 private VideoView vv_main_vedio;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_vedio);
  vv_main_vedio = (VideoView) findViewById(R.id.vv_main_vedio);

  //给videoView设置播放来源
  vv_main_vedio.setVideoPath("file://mnt/sdcard/Movies/sister.mp4");

  //实例化媒体控制器
  MediaController mediaController=new MediaController(this);

  //给activity_vedio设置控制器
  vv_main_vedio.setMediaController(mediaController);

  mediaController.setMediaPlayer(vv_main_vedio);

 }
}

VideoView通过与MediaController类结合使用,开发者可以不用自己控制播放与暂停。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-02-11

Android VideoView类实例讲解

本节使用系统的示例类VideoView继续SurfaceView类相关内容的讲解,以让大家能更深入理解Android系统中图形绘制基础类的实现原理.也许你会发现无法改变VideoView类的控制方面,我们可以通过重构VideoView类来实现更加个性化的播放器.          下面是VideoView类的相关代码. Java 代码 public class VideoView extends SurfaceView implements MediaPlayerControl { privat

android多媒体类VideoView使用方法详解

一.概述 VideoView类将视频的显示和控制集于一身,我们可以借助它完成一个简易的视频播放器.VideoView和MediaPlayer也比较相似. 二.VideoView的使用方法 它主要有以下几种常用方法 步骤: 1.指定视频文件的路径, 2.接下来调用start()方法就可以开始播放视频,pause()方法就会暂停播放,resume()方法就会重新播放 注:获取视频文件也需要运行时权限,所有相关逻辑也需要写.       最后不要忘记在AndroidManifest.xml文件中声明用

android使用videoview播放视频

复制代码 代码如下: public class Activity01 extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState); setContentView(R.layout.main); final VideoView vid

Android videoview抢占焦点的处理方法

问题描述: android 机顶盒应用: 应用程序主界面(MainActivity)只有两个控件,一个videoview和一个button. 视频框设置无焦点,按键有焦点. 首次进入应用时焦点正常,聚焦在button上:但是当点击button跳转到下一个activity并返回时,焦点却聚焦到了videoview上,并且代码里强制设置焦点: Button.requestFocus(); 无效,现象是视频加载时,焦点是在button处,但是当视频加载完成开始播放时,整个activity失去焦点,几秒

Android自定义播放器控件VideoView

介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actvity里了,写完一看我靠代码好乱,于是就写了个自定义的播放器控件,支持指定大小,可以横竖屏切换,手动左右滑动快进快退.好了,下面开始. 效果图有点卡,我也不知道为啥..... VideoView介绍 这个是我们实现视频播放最主要的控件,详细的介绍大家百度就去看,这里介绍几个常用的方法. 用于播放视频

详解Android App中使用VideoView来实现视频播放的方法

通过VideoView播放视频的步骤: 1.在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件 2.调用VideoView的如下两个方法来加载指定的视频 (1)setVidePath(String path):加载path文件代表的视频 (2)setVideoURI(Uri uri):加载uri所对应的视频 3.调用VideoView的start().stop().psuse()方法来控制视频的播放 VideoView通过与MediaController类结合使用,

android视频播放简单实现示例(VideoView&MediaPlayer)

如果你看过我的<android音乐播放简单实现(MediaPlayer)>,那么本篇将会毫无压力. 首先是主界面的三个按钮和一个播放控件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sche

Android使用VideoView播放本地视频和网络视频的方法

1.效果展示 2.布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="matc

Android编程实现VideoView循环播放功能的方法

本文实例讲述了Android编程实现VideoView循环播放功能的方法.分享给大家供大家参考,具体如下: package com.hangcheng; import com.example.bdcustomer_demo.R; import com.hangcheng.view.MyVideoView; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import

android之视频播放系统VideoView和自定义VideoView控件的应用

Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频. 1:自定义VideoView控件 2:布局代码 3:Activity代码: 4:网络权限 5:效果图 小结:其中的Uri mUri = Uri.parse("android.resource://" + getPackageName() +"/"+ R.raw.qiche);//本地视频 是加载的本地视频,可以下载一个视频,在res

实例讲解Android中的View类以及自定义View控件的方法

View的简单理解和实例 1.View的基本概念 在Activity显示的控件 都叫做View(View类 是所有的控件类的父类  比如 文本 按钮) 2.在Activity当中获取代表View的对象 Activity读取布局文件生成相对应的 各种View对象 TextView textView=(TextView)findViewBy(R.id.textView) 3.设置view的属性 Activity_mian.xml 这样的xml布局文件中发现了,类似@+id/和@id/到底有什么区别呢

Android中View自定义组合控件的基本编写方法

有很多情况下,我们只要运用好Android给我提供好的控件,经过布局巧妙的结合在一起,就是一个新的控件,我称之为"自定义组合控件". 那么,这种自定义组合控件在什么情况下用呢?或者大家在做项目时候会发现,某些布局会被重复的利用,同一个布局的XML代码块会被重复的复制黏贴多次,这样会造成代码结构混乱不说,代码量也会增大,各种控件都需要在Java代码中被申明和处理相应的逻辑,工作量着实不小,所以,必须要找到一个合理的"偷懒"的方式,开动脑经去怎么简化以上说的不必要的麻烦

android自定义倒计时控件示例

自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.content.Context;import android.content.res.TypedArray;import android.graphics.Paint;import android.text.Html;import android.util.AttributeSet;import android.widget.TextView; import com.new0315.R;

Android自定义表格控件满足人们对视觉的需求

Android平台已经给我们提供了很多标准的组件,如:TextView.EditView.Button.ImageView.Menu等,还有许多布局控件,常见的有:AbsoluteLayout.LinerLayout.RelativeLayout.TableLayout等.但随着人们对视觉的需求,基本组件已无法满足人们求新求异的要求,于是我们常常会自定义组件,用来实现更美观的UI界面. 实现自定义控件通常有两种途径,一种是继承View类,重写其中的重要方法,另一种是继承ViewGroup类,通过

在Android开发中使用自定义组合控件的例子

一.定义一个XML布局文件 setting_item_view.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height

Android开发中自定义ProgressBar控件的方法示例

本文实例讲述了Android开发中自定义ProgressBar控件的方法.分享给大家供大家参考,具体如下: 很简单,首先加载Drawable,在onMeasure设置好其区域大小, 然后使用canvas.clipRect绘图 public class ProgressView extends ImageView { private Drawable maskDraw; /** * 加载的进度 0-100 */ private int mProcess = 20; public ProgressV

Android使用GridLayout绘制自定义日历控件

效果图 思路:就是先设置Gridlayout的行列数,然后往里面放置一定数目的自定义日历按钮控件,最后实现日历逻辑就可以了. 步骤: 第一步:自定义日历控件(初步) 第二步:实现自定义单个日期按钮控件 第三步:将第二步得到的控件动态添加到第一步的布局中,并实现日期逻辑 第四步:编写单个日期点击监听器接口 第一步:自定义日历控件(初步) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmln

Android自定义组合控件之自定义下拉刷新和左滑删除实例代码

绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一个,做完了和QQ的对比了一下,并没有太大区别,今天分享给大家,其实并不难,但是不知道为什么网上没有比较好的Demo,当你的项目真的很急的时候,又没有比较好的Demo,那么"那条友谊的小船儿真是说翻就翻啊",好了,下面先来具体看一下实现后的效果吧: 代码已经上传到Github上了,小伙伴们记

Android自定义View控件实现刷新效果

三种得到LinearInflater的方法 a. LayoutInflater inflater = getLayoutInflater(); b. LayoutInflater localinflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); c. LayoutInflater inflater = LayoutInflater.from(context); onDraw 方法

Android自定义控件之自定义组合控件(三)

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一).Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的.  1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xml v