package cn.c;  
import java.io.File;  
import java.io.IOException;  
import android.app.Activity;  
import android.media.MediaPlayer;  
import android.media.MediaPlayer.OnCompletionListener;  
import android.media.MediaPlayer.OnErrorListener;  
import android.media.MediaPlayer.OnInfoListener;  
import android.media.MediaPlayer.OnPreparedListener;  
import android.media.MediaPlayer.OnSeekCompleteListener;  
import android.media.MediaPlayer.OnVideoSizeChangedListener;  
import android.os.Bundle;  
import android.os.Environment;  
import android.view.Display;  
import android.view.SurfaceHolder;  
import android.view.SurfaceView;  
import android.widget.LinearLayout;  
 
  
 
  
public class MainActivity extends Activity implements   
OnCompletionListener,OnErrorListener,OnInfoListener,OnPreparedListener,  
OnSeekCompleteListener,OnVideoSizeChangedListener,SurfaceHolder.Callback{  
    private SurfaceView mSurfaceView;  
    private SurfaceHolder mSurfaceHolder;  
    private Display mDisplay;  
    private MediaPlayer mMediaPlayer;  
    int videoWidth=0;  
    int videoHeight=0;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        mDisplay=getWindowManager().getDefaultDisplay();  
        mSurfaceView=(SurfaceView) findViewById(R.id.surfaceView);  
        mSurfaceHolder=mSurfaceView.getHolder();  
        //SurfaceHolder是用于管理SurfaceView对象  
        //那它是怎么做到管理的呢?即用mSurfaceHolder  
        //添加回调即addCallback.  
        //该类实现了SurfaceHolder.Callback接口,所以addCallback(this)  
        //在SurfaceHolder.Callback接口中一共有三个方法来实现对于  
        //SurfaceView对象的管理,即:  
        //surfaceCreated()  
        //surfaceChanged()  
        //surfaceDestroyed()  
        //概况:SurfaceHolder主要作用是监控底层的情况  
        mSurfaceHolder.addCallback(this);  
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
          
        mMediaPlayer=new MediaPlayer();  
        mMediaPlayer.setOnCompletionListener(this);  
        mMediaPlayer.setOnErrorListener(this);  
        mMediaPlayer.setOnInfoListener(this);  
        mMediaPlayer.setOnPreparedListener(this);  
        mMediaPlayer.setOnSeekCompleteListener(this);  
        mMediaPlayer.setOnVideoSizeChangedListener(this);  
        String path=Environment.getExternalStorageDirectory().getPath()  
        +File.separator+"Test_Movie.m4v";  
        try {  
            //设置MediaPlayer将要播放的视频  
            mMediaPlayer.setDataSource(path);  
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();  
            finish();  
        } catch (IllegalStateException e) {  
            e.printStackTrace();  
            finish();  
        } catch (IOException e) {  
            e.printStackTrace();  
            finish();  
        }  
    }  
    //来自于SurfaceHolder.Callback接口  
    //创建SurfaceView完成时,会调用该方法  
    public void surfaceCreated(SurfaceHolder holder) {  
        //设置MediaPlayer的视频输出界面  
        //只显示音频而不显示视频时可不调用这个方法  
        mMediaPlayer.setDisplay(mSurfaceHolder);  
        try {  
            //准备播放,调用mMediaPlayer.prepareAsync();  
            //方法后会执行覆写后的  
            //public void onPrepared(MediaPlayer mp)  
            //注意:  
            //也可调用prepare()解码,但为一个同步的操作  
            mMediaPlayer.prepareAsync();  
        } catch (Exception e) {  
            e.printStackTrace();  
            finish();  
        }  
    }  
    //来自于SurfaceHolder.Callback接口  
    //当SurfaceView的宽度,高度或其他参数发生变化时,会调用该方法  
    public void surfaceChanged(SurfaceHolder holder,   
            int format, int width,int height) {  
          
    }  
    //来自于SurfaceHolder.Callback接口  
    //当SurfaceView摧毁时,会调用该方法  
    public void surfaceDestroyed(SurfaceHolder holder) {  
          
    }  
    //来自于MediaPlayer.OnVideoSizeChangedListener接口  
    //当视频的宽度或高度发生变化时调用该方法  
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {  
          
    }  
    //来自于MediaPlayer.OnSeekCompleteListener接口  
    public void onSeekComplete(MediaPlayer mp) {  
          
    }  
    //来自于MediaPlayer.OnPreparedListener接口  
    //一旦调用该方法,MediaPlayer就进入了"准备就绪"  
    //状态,准备开始播放.  
    //此处可用于动态设置SurfaceView的宽和高!!!  
    public void onPrepared(MediaPlayer mediaPlayer) {  
        videoWidth=mediaPlayer.getVideoWidth();  
        videoHeight=mediaPlayer.getVideoHeight();  
        if (videoWidth > mDisplay.getWidth()|| videoHeight > mDisplay.getHeight()) {  
            float heightRatio = (float) videoHeight/ (float) mDisplay.getHeight();  
            float widthRatio = (float) videoWidth/ (float) mDisplay.getWidth();  
            if (heightRatio > 1 || widthRatio > 1) {  
                if (heightRatio > widthRatio) {  
                    videoHeight = (int) Math.ceil((float) videoHeight/ (float) heightRatio);  
                    videoWidth = (int) Math.ceil((float) videoWidth/ (float) heightRatio);  
                } else {  
                    videoHeight = (int) Math.ceil((float) videoHeight/ (float) widthRatio);  
                    videoWidth = (int) Math.ceil((float) videoWidth/ (float) widthRatio);  
                }  
            }  
        }  
        //设置SurfaceView的宽和高  
        mSurfaceView.setLayoutParams  
        (new LinearLayout.LayoutParams(videoWidth,videoHeight));  
        //MediaPlayer开始播放  
        mediaPlayer.start();  
    }  
    //来自于MediaPlayer.OnInfoListener接口  
    //当出现关于播放媒体的特定信息或者需要发出警告的时候  
    //将调用该方法  
    //比如开始缓冲、缓冲结束、下载速度变化(该行待验证)  
    //小结:这些Info都是以MediaPlayer.MEDIA_INFO_开头的  
    public boolean onInfo(MediaPlayer mp, int what, int extra) {  
        if (what==MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING) {  
            //音频和视频数据不正确地交错时将出现该提示信息.在一个  
            //正确交错的媒体文件中,音频和视频样本将依序排列,从而  
            //使得播放可以有效和平稳地进行  
        }  
        if (what==MediaPlayer.MEDIA_INFO_NOT_SEEKABLE) {  
            //当媒体不能正确定位时将出现该提示信息.  
            //此时意味着它可能是一个在线流  
        }  
        if (what==MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING) {  
            //当设备无法播放视频时将出现该提示信息  
            //比如视频太复杂或者码率过高  
        }  
        if (what==MediaPlayer.MEDIA_INFO_METADATA_UPDATE) {  
            //当新的元数据可用时将出现该提示信息  
        }  
        if (what==MediaPlayer.MEDIA_INFO_UNKNOWN) {  
            //其余不可知提示信息  
        }  
        return false;  
    }  
    //来自于MediaPlayer.OnErrorListener接口  
    //MediaPlayer发生错误时会调用该方法  
    //只有如下这三种错误.  
    //小结:这些错误都是以MediaPlayer.MEDIA_ERROR.开头的  
    public boolean onError(MediaPlayer mp, int what, int extra) {  
        if (what==MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) {  
            System.out.println("第一种错误");  
        }  
        if (what==MediaPlayer.MEDIA_ERROR_SERVER_DIED) {  
            System.out.println("第二种错误");  
        }  
        if (what==MediaPlayer.MEDIA_ERROR_UNKNOWN) {  
            System.out.println("第三种错误");  
        }  
        return false;  
    }  
    //来自于MediaPlayer.OnCompletionListener接口  
    //当MediaPlayer播放完文件时,会调用该方法.  
    //此时可以进行一些其他的操作比如:播放下一个视频  
    public void onCompletion(MediaPlayer mp) {  
           finish();          
    }  
}  

Android播放视频的更多相关文章

  1. Android 播放视频文件

    package com.example.myvideo2; import java.io.File; import android.app.Activity; import android.net.U ...

  2. android: 播放视频

    播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView 类来实现的.这个 类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器. VideoView 的用法和 ...

  3. Android 播放视频并获取指定时间的帧画面

    最近做的项目要求既能播放视频(类似于视频播放器),又能每隔1s左右获取一帧视频画面,然后对图片进行处理,调查了一周,也被折磨了一周,总算找到了大致符合要求的方法.首先对调查过程中涉及到的方法进行简单介 ...

  4. H5调用Android播放视频

    webView.loadUrl("http://10.0.2.2:8080/assets/RealNetJSCallJavaActivity.htm"); js调用的Java文件中 ...

  5. Unity3D Android播放视频

    http://blog.csdn.net/awnuxcvbn/article/details/17719789 using UnityEngine; using System.Collections; ...

  6. android 播放视频时切换全屏隐藏状态栏

    1. Demo: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance ...

  7. android采用videoView播放视频(包装)

    //android播放视频.用法:于androidManifest.xml添加activity, // <activity android:name=".PlayVideo" ...

  8. Cocos2dx3.11.1Android播放视频,后台 黑屏,无法记忆播放bug修改

    /* * Copyright (C) 2006 The Android Open Source Project * Copyright (c) 2014 Chukong Technologies In ...

  9. Atitit.android播放smb 网络邻居视频文件解决方案

    Atitit.android播放smb 网络邻居视频文件解决方案 Android4.4 1.1. Android4视频播放器不能直接地支持smb协议..子好先转换成个http流 1.2. ES文件浏览 ...

随机推荐

  1. python: hashlib 加密模块

    加密模块hashlib import hashlib m=hashlib.md5() m.update(b'hello') print(m.hexdigest()) #十六进制加密 m.update( ...

  2. YTU 3019: 螺旋方阵

    3019: 螺旋方阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 题目描述 以下是一个5*5阶螺旋方阵.设计一个程序,输出该形式的n*n阶方阵(顺时针方向旋进).   ...

  3. inux awk命令详解

    http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编 ...

  4. Poj(2367),拓扑排序

    题目链接:http://poj.org/problem?id=2367 题意: 知道一个数n, 然后n行,编号1到n, 每行输入几个数,该行的编号排在这几个数前面,输出一种符合要求的编号名次排序. 拓 ...

  5. C#中通过三边长判断三角形类型(三角形测试用例)

    对于<编程之美>P292上关于三角形测试用例的问题,题目是这样的: 输入三角形的三条边长,判断是否能构成一个三角形(不考虑退化三角形,即面积为零的三角形),是什么样的三角形(直角.锐角.钝 ...

  6. log4j: 不同的类使用不同的日志

    有时候会需要某些功能中使用独立的日志文件,以下为代码示例. public final static String LOGGER_NAME = "MyFunction"; priva ...

  7. 提高开发效率的 Eclipse 实用操作

    工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...

  8. C#数组的排序(正序逆序)

    C#数组的排序(正序逆序) 这种排序 超级简单的 ! using System; using System.Collections.Generic; using System.Linq; using ...

  9. Maven向本地仓库导入官方仓库没有的jar包

    最近工程中需要用到JNotify Java包,可是在Maven公共仓库中没有找到该jar文件,下面是一个补救的办法. 以jnotify-0.94.jar为例: 需要用到Maven如下命令: mvn i ...

  10. 正则表达式的使用(C++)

    1.判断手机号是否合法 const regex phonepattern("^[1]+[3,5]+\\d{9}$"); const regex Mobilepatten(" ...