zoukankan      html  css  js  c++  java
  • Android入门1:使用VideoView和MediController播放视频

    最近在搞Android,入门曲线还是挺陡峭的,主要还是自己对Java的理解不够深入。前后学习了几天,把最近学习到的一些知识点总结归纳一下,正所谓温故而知新。

    目前想搞一个禁播视频站,主要内容都是一些大陆被墙的动漫啊,美剧啥的,比如我最爱的死亡笔记。内容不包含18禁的~感觉有些小伙伴要失望咯。

    1. Android入门素材

    以下罗列在我学习过程中使用的感觉还算不错的素材

    a. Official Android Training:developer.android.com/training/index.html

    b. 上述Android官方教程中文翻译版本:http://hukai.me/android-training-course-in-chinese/index.html

    c. imooc网站[Android攻城狮入门系列]:http://www.imooc.com/index/search?words=android

    d.《第一行代码-Android》pdf我放到自己的百度网盘里面,希望大家不要去告诉作者(笑)

    链接: http://pan.baidu.com/s/1sjy3rw5 密码: 7gy6

    2. VideoView和MediaController介绍

    Android VideoView类为我们提供了十分方便的视频播放API,其主要方法有。

    void start():开始播放
    void stopPlayback():停止播放
    void pause():暂停
    void resume():重新播放
    void seekTo(int msec):从第几毫秒开始播放
    int getCurrentPosition():获取当前播放的位置
    int getDuration():获取当前播放视频的总长度
    boolean isPlaying():当前VideoView是否在播放视频
    void setVideoPath(String path):以文件路径的方式设置VideoView播放的视频源。
    void setVideoURI(Uri uri):以Uri的方式设置视频源,可以是网络Uri或本地Uri。
    setMediaController(MediaController controller):设置MediaController控制器。
    setOnCompletionListener(MediaPlayer.onCompletionListener l):监听播放完成的事件。
    setOnErrorListener(MediaPlayer.OnErrorListener l):监听播放发生错误时候的事件。
    setOnPreparedListener(MediaPlayer.OnPreparedListener l)::监听视频装载完成的事件。
    

    除了简单的操作和丰富的API以外,我们在装载视频时,无需进行编码,播放完成后也无需手动回收资源。

    除了播放视频,Media Controller类则为我们提供了一个悬浮的操作栏,包含了播放,暂停,快进,快退,上一个,下一个等功能键。甚至连拖动进度条至某处播放都已经实现,简直是业界良心。在使用前VideoView和MediController需要相互指定控件。其内置方法有。

    boolean isShowing():当前悬浮控制栏是否显示。
    void setMediaPlayer(MediaController.MediaPlayerControl player):设置控制的组件。
    void setPrevNextListeners(View.OnClickListener next,View.OnClickListener prev):设置上一个视频、下一个视频的切换事件。
    

    默认情况下,Media Controller悬浮显示3s后隐藏,触摸响应的VideoView呼出。默认上一个,下一个按钮隐藏。

    3.播放视频Demo程序

    package cn.edu.sjtu.videoplayer.bannedvideoplayer;
    
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.*;
    import java.io.File;
    
    public class MainActivity extends AppCompatActivity {
    
        private VideoView vv_videoview;
        private MediaController mController;
        private Button btn_play;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn_play = (Button) findViewById(R.id.btn_play);
            vv_videoview = (VideoView) findViewById(R.id.vv_videoview);
            mController = new MediaController(this);
    
    		// Button响应事件,播放本地视频
            btn_play.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    			// Uri videoUri = Uri.parse("http://www.androidbegin.com/tutorial/AndroidCommercial.3gp");
    			// vv_videoview.setVideoURI(videoUri);
                    File videoFile = new File("/sdcard/DCIM/Camera/test.mp4");
                    if (videoFile.exists()) {
                        vv_videoview.setVideoPath(videoFile.getAbsolutePath());
                        vv_videoview.setMediaController(mController);
                        vv_videoview.start();
                        vv_videoview.requestFocus();
                    }
                }
            });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    Xml文件只有简单地一个Button和VideoView控件,节约篇幅就不上了,由于博主一直使用真机Debug,这里就不截图了。如果需要播放网络视频,只需要看我注释的两行,将setVideoPath()更改为相应的setVideoURI()就可以了。这里需要在AndroidManifest.xml添加两条权限。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    

    这里需要多啰嗦的,也是经常会困惑刚入门同志的几个点。

    a. 增加的权限开头android.permission是小写的,Android Studio可能会默认补全为大写,导致没有相应权限。

    b. VideoView虽然可以播放网络视频,但是网络视频流实际是分为Http协议和RTSP(Real Time Streaming Protocal)两种。RTSP协议支持实时播放,而Http协议则需要缓冲一定时间才能够播放。

    c. 国内传统的视频站给出的URL并不是真实视频地址,因此像优酷,爱奇艺等网站的视频并不能直接使用VideoView播放。

    4. Reference:

    a) http://www.androidbegin.com/tutorial/android-video-streaming-videoview-tutorial/

    b) http://www.cnblogs.com/plokmju/p/android_videoview.html


    By tjt

    2015.12.02

  • 相关阅读:
    C++中派生类使用基类成员的问题
    关于linux安装kettle的总结
    Servlet+JSP教程之:第一个Web程序
    Oracle开启和关闭的四种模式
    Android 图片设置圆角 方法之二
    Hive[6] HiveQL 查询
    JavaScript技巧45招
    JavaScript 权威指南第6版
    js 使用技巧
    Hive[5] HiveQL 数据操作
  • 原文地址:https://www.cnblogs.com/onlytjt/p/5045259.html
Copyright © 2011-2022 走看看