Android视频播放器开发

第一个播放器开发的实例,是通过VideoView+MediaController的方式实现的
主要实现了视频播放、暂停、快进、快退的功能
创建项目的名称为VideoView,建立类名为MyVideoView
一、项目的布局写法
代码中注释的部分记得去掉
注:横竖屏切换时会导致重走生命周期,为了避免这种情况,在在AndroidManifest中配置

    <activity android:name=".MainActivity"android:configChanges="keyboardHidden|orientation|screenSize">

除此之外还需要在AndroidManifest中添加网络权限和sd卡权限

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

在activity_main.xml中添加视图布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.eddie.videoview.MainActivity"><RelativeLayout
        android:id="@+id/rl"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center">//控制视频大小<com.example.eddie.videoview.MyVideoView
            android:id="@+id/videoview"android:layout_width="380dp"android:layout_height="380dp" /></RelativeLayout><Button
        android:id="@+id/btn"android:layout_width="match_parent"android:layout_height="60dp"android:layout_below="@id/rl"android:text="开始" /><Button
        android:id="@+id/btn_2"android:layout_width="match_parent"android:layout_height="60dp"android:layout_below="@id/btn"android:text="全屏" />
</RelativeLayout>

二、主程序
记录三个AndroidStudio快捷键:
1、ctrl+Alt+Shift+L用于初始化代码,让代码对齐
2、ctrl+Alt+Shift+T可以抽取代码中的变量为成员变量
3、ctrl+d用于复制代码到下一行

public class MainActivity extends AppCompatActivity {private VideoView videoView;//播放视频的视图private Button btn;//播放按钮private Button btn_2;//全屏播放按钮private MediaController mMediaController;//视频播放控制器private boolean isFullScreen;//是否全屏的判断private boolean isWantExit;//判断是否真的想退出private MainActivity mMainActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mMainActivity = this;initView();//绑定视图initListener();//绑定事件}/** 绑定视图* */private void initView() {videoView = (VideoView) findViewById(R.id.videoview);btn = (Button) findViewById(R.id.btn);btn_2 = (Button) findViewById(R.id.btn_2);mMediaController = new MediaController(this);//初始化视频播放控制器}/**设置点击事件以及监听* */private void initListener() {//设置准备完成监听videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {//TODO 视频准备完成后,调用此处方法}});//设置播放完成监听videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {//TODO 视频播放完成后,调用此处方法}});//设置视频播放出错时候的监听videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {//TODO 视频播放解析出错,调用此处方法return true;}});//给“开始”button设置点击事件,在点击后进行播放视频,并且将控制器与视频绑定btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//设置播放视频地址,要提前配置权限videoView.setVideoPath("http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8");//videoview绑定控制器videoView.setMediaController(mMediaController);//把控制器视图平铺到哪一个视图上(Mediacontroller底层是一个popupwindow)mMediaController.setAnchorView(videoView);videoView.start();}});btn_2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {changeScreen();}});}//半屏变全屏public void changeScreen() {if (isFullScreen) {//如果是全屏就变为半屏//1、将当前activity设置为竖屏mMainActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//2、给videoview设置半屏参数RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(dp2px(this, 300), dp2px(this, 300));//代码中写的都是px值videoView.setLayoutParams(layoutParams);isFullScreen = false;} else {//如果不是全屏就变为全屏//1、把屏幕编程全屏this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//width,height//2、把当前activity设置为全屏mMainActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//3、给videoview设置全屏参数RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);//width,heightvideoView.setLayoutParams(layoutParams);isFullScreen = true;}}/** 当点击屏幕的时候会调用,如果返回true表示消费掉该事件,如果返回false表示不消费该事件,只是处理方法内业务逻辑,之后事件继续传递* */@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {//判断按钮是否为返回键if (isFullScreen) {//如果是全屏就退出全屏changeScreen();return false;} else {//如果不是全屏,就开始退出appexit();//开始退出,做一个判断用户是否想退出return false;}}return super.onKeyDown(keyCode, event);}private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//2s后如果用户没有再次点击回退键,就将用户是否想退出的布尔值变为false,标识用户不想退出isWantExit = false;}};private void exit() {if (!isWantExit) {isWantExit = true;//用户表示我想退出Toast.makeText(this, "你真的想退出吗", Toast.LENGTH_SHORT).show();//增加异步处理的延迟mHandler.sendEmptyMessageDelayed(0, 2000);} else {//表示真的想退出了finish();System.exit(0);//把app占用的线程杀死,彻底退出 app}}/** 工具类方法* */public static int px2dp(Context context, float pxValue) {float density = context.getResources().getDisplayMetrics().density;//获得当前屏幕,获得屏幕原型,获得屏幕密度return (int) (pxValue / density + 0.5f);}public static int dp2px(Context context, float dpValue) {float density = context.getResources().getDisplayMetrics().density;//获得当前屏幕,获得屏幕原型,获得屏幕密度return (int) (dpValue * density + 0.5f);}
}

Android视频播放器开发相关推荐

  1. 基于NDK、C++、FFmpeg的android视频播放器开发实战-夏曹俊-专题视频课程

    基于NDK.C++.FFmpeg的android视频播放器开发实战-1796人已学习 课程介绍         课程包含了对流媒体(拉流)的播放,演示了播放rtmp的香港卫视,支持rtsp摄像头和ht ...

  2. 视频教程-基于NDK、C++、FFmpeg的android视频播放器开发实战-Android

    基于NDK.C++.FFmpeg的android视频播放器开发实战 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真,计算 ...

  3. 记一次Android视频播放器开发

    播放器入门 看小电影多年 当年甚至还是用QTplayer:而李开复,已经从技术员,技术总监,HR,出书,风投,隐退的华丽转身 而我们还只是个"程序员" 这么多年过去了,好像还真没认 ...

  4. Android视频播放器开发—— 探究MediaPlayer

    概述 之前在公司都是做金融和博彩相关的app,很少接触到视频播放类的应用开发,趁最近比较闲,想逐步学习相关的知识,给自己增加点视频类app开发的经验,也希望读者能够从我个人的学习当中得到一些启发. 一 ...

  5. csdn android视频播放器开发

    http://blog.csdn.net/column/details/myvideo.html

  6. 学习笔记(2):基于NDK、C++、FFmpeg的android视频播放器开发实战-音视频基础知识Mpeg4封装格式音视频编码格式讲解...

    立即学习:https://edu.csdn.net/course/play/7417/151027?utm_source=blogtoedu 封装:将音视频从文件中读出来 解码:解压出来,转换成显卡支 ...

  7. 实现在Android本地视频播放器开发

    在Android本地视频播放器开发中的搜索本地视频章节中,我们能够搜索本地视频并且显示每个视频的图片.标题.时间长度,当然如果需要添加其他的例如视频的长度和宽度可以使用Video类中的方法,既然我们获 ...

  8. Android本地视频播放器开发--视频解码

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

  9. Android进阶:自定义视频播放器开发(下)

    上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个vi ...

  10. android 编译 sdl,SDL编译 - Android本地视频播放器开发_Linux编程_Linux公社-Linux系统门户网站...

    在上一章  Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)[http://www.linuxidc.com/Linux/2013-06/85955p5.htm]中使用Ope ...

最新文章

  1. 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻
  2. centos 7 ssh 安装mysql,Centos 7 安装Airflow
  3. 用户控件中动态加入脚本引用
  4. C# winform开发:Graphics、pictureBox同时画多个矩形
  5. SAP Spartacus list.component.ts的listData$数据的触发逻辑
  6. 玩转Nodejs日志管理log4js
  7. 他回国后对学生说,玩会这12个游戏就能掌握python基础,其实不难
  8. 跨境电子商务独立站如何找到热门的利基市场
  9. 打着改造传统市场的旗号玩垄断
  10. 操作系统直接决定了计算机系统的整体性能
  11. 解决办法:std没有成员initializer_list
  12. JAVA的引用类型变量(C/C++中叫指针)
  13. java并发包是谁编写的_0.Java并发包系列开篇
  14. 用树莓派学嵌入式linux,基于树莓派的嵌入式Linux开发教学探索
  15. linux下ps ef命令详解,linux中ps -ef命令
  16. java workflow 教程_学习(史帝芬)osworkflow入门教程后的一些体会
  17. 【Pytorch】基于卷积神经网络实现的面部表情识别
  18. 蓝牙遥控器连接流程分析
  19. macOS开启高性能模式
  20. 刀片服务器性能对比,刀片服务器对比-刀锋上的较量

热门文章

  1. html head标签详解
  2. 监听SpringBoot 服务启动成功事件并打印信息
  3. 三、网页中的超链接(hyperlink)
  4. 回眸 2021,展望 2022
  5. Go使用绘图的库(go-charts、go-echarts)
  6. 冇内容管理系统分析-js中关于array的slice和sort方法(转自JavaEye)
  7. 快速下载 Android framework 源码
  8. position的4个值和用法
  9. 二元函数最大最小值定理证明_Von Neumann最小最大值定理的归纳法证明
  10. 计算机学科全国211大学排名,49所985、211重点大学排名第一的专业!