android 播放视频

news2025/4/26 13:18:00

播放视频文件

新建一个activity_main.xml文件,文件中放置了3个按钮,分别用于控制视频的播放、暂停和重新播放。另外在按钮的下面又放置了一个VideoView,稍后的视频就将在这里显示。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    tools:context=".MainActivity"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <android.widget.Button
        android:background="#2196F3"
        android:id="@+id/play"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="播放" />
    <android.widget.Button
        android:id="@+id/pause"
        android:background="#F44336"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="暂停" />
    <android.widget.Button
        android:id="@+id/replay"
        android:background="#FFEB3B"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="重播" />
    </LinearLayout>
        <VideoView
            android:id="@+id/videoView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

</LinearLayout>

我们看到,按钮使用线性布局(LinearLayout)进行排列,每个按钮的宽度为0dp,高度为wrap_content,权重(layout_weight)为1,这样它们会平均分配可用空间。
接下来的问题就是存放视频资源了,很可惜的是,VideoView不支持直接播放assets目录下的
视频资源,所以我们只能寻找其他的解决方案。res目录下允许我们再创建一个raw目录,像诸
如音频、视频之类的资源文件也可以放在这里,并且VideoView是可以直接播放这个目录下的
视频资源的。
现在右击app/src/main/res→New→Directory,在弹出的对话框中输入“raw”,完成raw目录
的创建,并把要播放的视频资源放在里面。这里我提前准备了一个video.mp4资源(资源下载
方式见前言),如图所示,你也可以使用自己准备的视频资源。
在这里插入图片描述
修改MainActivity类代码:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val uri = Uri.parse("android.resource://$packageName/${R.raw.video}")
        val videoView: VideoView = findViewById(R.id.videoView)
        val play: Button = findViewById(R.id.play)
        val replay: Button = findViewById(R.id.replay)
        val pause: Button = findViewById(R.id.pause)
        videoView.setVideoURI(uri)
        play.setOnClickListener {
            if (!videoView.isPlaying) {
                videoView.start()
            }
        }
        pause.setOnClickListener {
            if (videoView.isPlaying) {
                videoView.pause() // 暂停播放
            }
        }
        replay.setOnClickListener {
            if (videoView.isPlaying) {
                videoView.resume() // 重新播放
            }
        }
    }
}

代码很简单,通过Uri.parse方法解析视频资源的URI,并将其赋值给变量uri。接着,通过findViewById方法获取布局文件中的VideoView、Button控件,并分别赋值给变量videoView、play、replay和pause。效果图如下:
在这里插入图片描述

setOnPreparedListener的使用

实现一个显示视频时长的文字内容,先增加一个文本:

  <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />
videoView.setOnPreparedListener { mp ->
            // 当视频准备好开始播放时,会调用此方法
            val duration = mp.duration
            val minutes = duration / 1000 / 60
            val seconds = duration / 1000 % 60
            println("$duration 毫秒= $minutes 分钟又 $seconds 秒.")
            textView.text = StringBuilder("视频时长:$minutes 分钟 $seconds 秒")
        }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1823135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio新增功能:Device Streaming

今天将Android Studio升级到2023.3.1 Patch2。发现新增了Device Streaming功能。支持远程使用Google的物理设备调试程序。这样可以方便地在真实设备上测试自己的APP。这对于手头没有Google设备的开发者而言&#xff0c;确实方便很多。该功能目前处于测试阶段&#xff0c;在2025…

【机器学习300问】117、序列模型中的符号表示方法?以命名实体识别(NER)任务为例。

在序列模型中&#xff0c;特别是在命名实体识别(NER)任务中&#xff0c;我们通常会用一系列符号来表示输入序列、目标标签以及模型的结构和操作。本文列出一些常见的符号表示方法&#xff0c;结合NER任务进行解释。 一、什么是命名实体识别任务&#xff1f; &#xff08;1&am…

06 SpringBoot 配置文件详解-application.yaml

Spring Boot 提供了大量的自动配置&#xff0c;极大地简化了spring 应用的开发过程&#xff0c;当用户创建了一个 Spring Boot 项目后&#xff0c;即使不进行任何配置&#xff0c;该项目也能顺利的运行起来。当然&#xff0c;用户也可以根据自身的需要使用配置文件修改 Spring …

L50--- 104. 二叉树的最大深度(深搜)---Java版

1.题目描述 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 2.思路 这个二叉树的结构如下&#xff1a; 根节点 1 左子节点 2 右子节点 3 左子节点 4 计算过程 从根节点 1 开始计算&#xff1a; 计算左子树的最大深度&#xff1a; 根节点 2&#xf…

QTcreator编译器路径错误,no valid kit found

重装系统后&#xff0c;整个QT的应用换了一个盘&#xff0c;但是创建QT工程时默认的编译器路径还是以前的路径且无法修改&#xff0c;创建工程时&#xff0c;出现no valid kit found 可见在option下的编译器相关路径是在E盘且无法更改 进入现在的QT盘进行文件的修改 F:\QT\Too…

UnityAPI学习之协程原理与作用

协程的原理与作用 Unity 协程(Coroutine)原理与用法详解_unity coroutine-CSDN博客 using System.Collections; using System.Collections.Generic; using UnityEngine;public class NO14_coroutine : MonoBehaviour {Animator animator;// Start is called before the first…

深入掌握SystemVerilog验证:《SystemVerilog验证 测试平台编写指南》(可下载)

在数字设计的世界中&#xff0c;验证是确保硬件设计满足预期功能和性能要求的关键步骤。SystemVerilog作为一种先进的硬件描述语言&#xff0c;以其强大的验证特性&#xff0c;成为了设计和验证工程师的首选工具。 1. SystemVerilog验证的重要性 在数字设计流程中&#xff0c…

javaWeb项目-ssm+vue在线购物系统功能介绍

本项目源码&#xff1a;java-ssmvue在线购物系统的设计与实现源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;sprin…

[Nacos]No spring.config.import property has been defined

在学习 Spring Cloud Alibaba &#xff0c;Nacos组件&#xff0c;创建一个cloudalibaba-config-nacos-client&#xff0c;加载多配置集时遇到问题 配置了 bootstrap.yml 后启动项目报错&#xff1a; 是因为在springcloud 2020.0.2版本中把bootstrap的相关依赖从spring-cloud-s…

Python 中国象棋游戏【含Python源码 MX_011期】

简介&#xff1a; 中国象棋是一种古老而深受喜爱的策略棋类游戏&#xff0c;也被称为中国的国粹之一。它在中国有着悠久的历史&#xff0c;起源可以追溯到几个世纪以前。Python 中国象棋游戏是一个用Python编程语言编写的软件程序&#xff0c;旨在模拟和提供中国象棋的游戏体验…

一键获取CPU详情:Python最强查询工具实战教程

要在 Python 中查询 CPU 信息,可以使用多个强大的工具和库.以下是一些最常用和强大的库,可以帮助你获取详细的 CPU 信息&#xff1a; 1.psutil 2.cpuinfo 3.platform 4.os 1. 使用 psutil 库 psutil 是一个跨平台库,提供了获取系统和进程信息的便捷方法.它不仅可以获取 C…

I/O Stream设计实验

实验要求和目的 深入理解java输入输出流相关类的基本用法&#xff0c;并且可以掌握Java程序的编写和调试。 实验环境 Java语言&#xff0c;PC或android平台 实验具体内容 设计和编写以下程序&#xff1a; 程序1&#xff1a; 从键盘读入多行字符串&#xff08;英文&#xf…

生产运作管理--第六版陈荣秋

第一章&#xff1a; 生产运作的分类有哪些&#xff1f; 答&#xff1a;可以分为两大类&#xff1a; 产品生产: 产品生产是通过物理或者化学作用将有形输入转化为有形输出的过程。 按照工艺过程的特点&#xff0c;可以分为&#xff1a; 连续性生产&#xff1a;物料均匀、连续的按…

右值引用和移动语义

什么是左值&#xff1f;什么是右值&#xff1f; 通俗来讲&#xff0c;可以出现在赋值语句左侧的&#xff0c;为左值&#xff1b;只能出现在赋值语句右侧的&#xff0c;为右值。 左值与右值的本质区别在于&#xff1a;左值能取地址&#xff0c;但右值不能。 本文主要通过三个场景…

Commons-io工具包与Hutool工具包

Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包 作用:提高I0流的开发效率。 FileUtils类(文件/文件夹相关) static void copyFile(File srcFile,File destFile) 复制文件 static void copyDirectory(File srcDir,File destDir) 复…

你的职业规划就是面向贫穷的规划

如果你觉得作者的文章还有点用,请记得点赞 + 关注 说一个扎心的事实,就是我们绝大多数人的职业规划基本上都是错误的,都是面向贫穷的规划。 因为绝大多数人的职业规划都是打工人的职业规划,这种规划除了很少部分人最终能成为企业高管,实现层级跃迁外,绝大多数人在大多数…

递归解析 LXML 树并避免重复进入某个节点

1、问题背景 我们在使用 LXML 库解析 MathML 表达式时&#xff0c;可能会遇到这样一个问题&#xff1a;在递归解析过程中&#xff0c;我们可能会重复进入同一个节点&#xff0c;导致解析结果不正确。例如&#xff0c;我们希望将以下 MathML 表达式解析为 Python 表达式&#x…

DJ-122A电压继电器 柜内安装 电磁式继电器 约瑟JOSEF

系列型号&#xff1a; DJ-100A/Q系列电压继电器 DJ-111A/Q电压继电器; DJ-112A/Q电压继电器; DJ-121A/Q电压继电器; DJ-122A/Q电压继电器; DJ-131A/Q电压继电器; DJ-132A/Q电压继电器; DJ-131A/Q160CN电压继电器; DJ-131A/Q160C电压继电器; ​ 概述 DJ-100A/Q系列电…

linux安装dgl

1.DGL官网、选择与自己cuda、python版本匹配的dgl的whl文件CUDA11.8、python10并下载 2.用pip install运行 pip install /home/u2023170749/download/dgl-2.2.0cu118-cp310-cp310-manylinux1_x86_64.whl

RocketMQ在Centos7系统上单机部署

最近因为一些信创问题&#xff0c;要将RabbitMQ替换为RocketMQ&#xff0c;因此在此分享一些RocketMQ在Centos7系统上单机部署相关过程。 优缺点 RocketMQ的优点&#xff1a; 性能优越&#xff1a;RocketMQ在处理大量消息时&#xff0c;性能优于RabbitMQ。当面临每秒数万到数…