Android制作简易的音乐播放器和视频播放器

news2025/7/7 17:35:58

文章目录

  • 制作简易的音乐播放器和视频播放器
    • 播放多媒体文件
      • 播放音频
        • MediaPlayer的工作流程
        • 项目示例
      • 播放视频
        • 项目示例

制作简易的音乐播放器和视频播放器

播放多媒体文件

  • Android在播放音频和视频方面做了非常不错的支持,它提供了一套非常完整的API,使得开发者可以轻松编写出一个简易的音频或者视频播放器

播放音频

  • 在Android中播放音频文件一般使用MediaPlayer类来进行实现,他对多种格式的音频文件提供了非常全面的控制方法,从而使播放音乐的工作变得十分简单,下表列出了MediaPlayer类中一些较为常用的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnKJobu4-1671707953702)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221222164558552.png)]

MediaPlayer的工作流程

  • 首先需要创建一个MediaPlayer对象,然后调用setDataSource()方法设置音频文件的播放路径,再调用prepare()方式使MediaPlayer进入准备状态.
  • 接下来调用start()方法就可以开始播放音频了,再调用pause()方法就会暂停,调用reset()方法就会停止播放.

项目示例

  • 新建一个PlayAudioTest项目,然后修改activity_main.xml当中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Play" />

    <Button
        android:id="@+id/pause"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Pause" />

    <Button
        android:id="@+id/stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Stop" />


</LinearLayout>
  • 定义了三个按钮分别表示播放,暂停,停止
  • MediaPlayer可以用于播放网络,本地以及应用程序安装包当中的音频,下面的例子来播放程序安装包中的音频.
  • AS允许我们再项目工程中创建一个assets目录,并在这个目录下面存放任意文件和子目录,这些文件和子目录在项目打包的时候会一并被打包到安装文件中,然后我们在程序中就可以借助AssetManager这个类提供的接口对assets目录下的文件进行读取.
  • 下面创建一个assets目录,这个目录必须创建在app/src/main这个目录下面,也就是和java,res这两个目录是平级的,右击app/src/main->new->Directory,再弹出的对话框中输入"assets",目录即可创建完成.
  • 然后准备一份音频资源放在这个目录下面即可
  • 接着修改MainActivity当中的代码逻辑
package com.zb.playaudiotest

import android.media.MediaPlayer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private val mediaPlayer = MediaPlayer()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initMediaPlayer()
        play.setOnClickListener {
            if (!mediaPlayer.isPlaying) {
                mediaPlayer.start() //开始播放
            }
        }
        pause.setOnClickListener {
            if (mediaPlayer.isPlaying) {
                mediaPlayer.pause() //暂停播放
            }
        }
        stop.setOnClickListener {
            if (mediaPlayer.isPlaying) {
                mediaPlayer.reset() //停止播放
                initMediaPlayer()
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        mediaPlayer.stop()
        mediaPlayer.release()
    }


    /**
     * 为mediaPlayer对象进行初始化
     */
    private fun initMediaPlayer() {
        val assetManager = assets
        val fd = assetManager.openFd("music.mp3")
        mediaPlayer.setDataSource(fd)
        mediaPlayer.prepare()
    }
}
  • 再类初始化的时候,创建一个MediaPlayer的实例,然后在onCreat()方法中调用initMediaPlayer()方法,为MediaPlayer对象进行初始化
  • 在initMediaPlayer()方法当中首先通过getAssets()方法得到一个AssetManager的实例,Assmanager可以用于读取assets目录下的任何资源,然后调用opedFd()方法将音频文件句柄打开,后面又依次调用了setDataSource()方法和prepare()方法,为mediaPlayer做好了播放前的准备.
  • 然后就是各个按钮的点击事件了,分别对应简单的开始,暂停,停止逻辑
  • 最后在onDestroy()方法中,我们还需要分别调用stop()方法和release()方法,将于MediaPlayer相关的资源释放掉.
  • 这样一个简易的音乐播放器就完成了.

播放视频

  • 播放视频主要使用VideoView类来实现,这个类将视频的显示和控制集于一身,我们仅仅借助它就可以完成一个简单的视频播放器.VideoView的用法和MediaPlayer也比较类似,常用方法如下表所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zo6MytSJ-1671707953704)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%8D%93/image-20221222174632519.png)]

项目示例

  • 新建一个PlayVideoTest项目,然后修改activity_main.xml文件中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/play"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="play" />

        <Button
            android:id="@+id/pause"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="pause" />

        <Button
            android:id="@+id/replay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="replay" />
    </LinearLayout>

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>
  • 在这个布局文件当中同样放置了三个按钮,分别用于控制视频的播放,暂停,重新播放,另外在按钮的下面还放置了一个VideoView,稍后的视频就会放在这个地方进行显示.
  • 接下来就是存放视频资源的问题了,很可惜的是在VideoView当中是不支持直接播放assets目录下的视屏资源的,所以只能寻找其他的解决方案了.
  • res目录下面允许我们再创建一个raw目录,像诸如视频,音频之类的文件也可以存放在这里,并且VideoView是可以直接播放这个目录下的视频资源的.
  • 右击app/src/main/res->New->Directory,在弹出的对话框当中输入"raw",完成raw目录的创建,并把要播放的视频资源放在里面即可,需要注意的是在raw下面存放的文件命名中不能有大写字母,否者会爆红.
  • 然后修改MainActivity当中的代码
package com.zb.playvideotest

import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

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}")
        videoView.setVideoURI(uri)
        play.setOnClickListener {
            if (!videoView.isPlaying) {
                videoView.start() //开始播放
            }
        }
        pause.setOnClickListener {
            if (videoView.isPlaying) {
                videoView.pause() //暂停播放
            }
        }
        replay.setOnClickListener {
            if (videoView.isPlaying) {
                videoView.resume() //重新播放
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        videoView.suspend()
    }
}
  • 在onCreat()方法当中,调用了Uri.parse()方法,将raw目录下的video.map文件解析成了Uri对象,这里使用的写法是Android要求的固定写法
  • 然后调用VideoView的setVideoURI()方法将刚才解析出来的Uri对象传入,这样VideoView就初始化完成了.
  • 之后就是各个按钮的点击事件了,最后还要子啊onDestory()方法当中调用一个videoView的suspend()方法,将VideoView所占用的资源释放掉.
  • 这样一个简易的视频播放器就制作完毕了

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

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

相关文章

JavaEE入门知识

1.为什么要学习框架&#xff1f; 1. 学习框架相当于从“⼩作坊”到“⼯⼚”的升级&#xff0c;⼩作坊什么都要⾃⼰做&#xff0c;⼯⼚是组件式装配&#xff0c;特点就是⾼效。 2. 框架更加易⽤、简单且⾼效。 2.创建一个Servlet项目&#xff08;我使用的是IDEA专业版&#…

USB TO SPI(上海同旺电子)调试器调试MCP6S92

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、MCP6S92 单端轨到轨输入/ 输出低增益PGA; 特性 • 复用输入&#xff1a;1 或2 个通道 • 8 种增益选择&#xff1a; - 1、2、4、5、8、10、16 或32 V/V • 串行外设接口&#xff08;SPI&#xff09; • 轨…

生成模型(三):基于流的生成模型(Flow-based model)

本文大纲如下&#xff1a; 到目前为止&#xff0c;已经介绍了[[生成模型-GAN]]和[[生成模型-VAE]]。它们都没有明确地学习真实数据的概率密度函数p(\mathbf{x})&#xff08;其中\mathbf{x}\in \mathcal{D}&#xff09;, 因为很难。以带有潜变量的生成模型为例&#xff0c;p(\ma…

Web前端105天day61-HTML5_CORE

HTML5CORE01 目录 前言 一、拖拽上传文件 1.1.文件上传 二、跨域 三、跨域解决方案 四、查看网站接口 五、文件上传服务 总结 前言 HTML5CORE01学习开始 HTML5 : 目前主流的 HTML 版本, 其中增加了很多新特性例如: 音视频, 网页存储技术 - webStorage一、拖拽上传文件…

TensorRT学习笔记 1 - 概述

TensorRT系列笔记是作者半年来学习和使用TensorRT(后称trt)积累笔记 整理和心得。包含trt的基本概念&#xff0c;相关资料&#xff0c;实践笔记&#xff0c;踩坑记录等等。 本篇博客希望可以初步说清楚 trt是什么&#xff1b;模型部署为什么使用trt&#xff0c;以及使用trt的…

渗透攻击MS08-067

学校课程关于Metasploit有基础的几个小实验&#xff0c;把它整理分享在这里。 实训目的&#xff1a; 熟悉Metasploit终端的使用方法&#xff0c;了解MS08-067漏洞&#xff0c;掌握对MS08-067漏洞攻击的方法。 场景描述&#xff1a; 在虚拟机环境下配置 “WinXP1”和“Kali …

华为机试_HJ63 DNA序列【中等】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码 学习代码 代码一 收藏点 描述 一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例&#xff08;定义为 GC-Ratio &#xff09;是序列中 G 和 C 两个字母的总的出现次数除以总的字…

公开竞价与封闭式竞价有什么不同?

电子竞价是电子采购的一种形式。电子采购是指通过信息和网络系统在线进行的招标采购过程。 电子竞价是指一种基于网络的系统&#xff0c;允许潜在供应商在网上实时竞争商品/服务的价格。电子竞价的使用方式类似于e-bay平台&#xff0c;出价最高者获胜。在建筑业&#xff0c;这…

前端_Vue_7.表单输入绑定

文章目录一、 表单输入绑定1.0. 表单&表单元素1.0.1. 表单1.0.2. 表单元素1.1. 基本用法1.1.1. 文本1.1.2. 多行文本1.1.3. 复选框1.1.4. 单选按钮1.1.5. 选择器1.2. 值绑定1.2.1. 复选框1.2.2. 单选按钮1.2.3. 选择器选项1.3. 修饰符1.3.1. .lazy1.3.2. .number1.3.3. .tr…

三角函数公式

三角函数的定义 锐角三角函数任意角三角函数正弦sin⁡Aac\sin A\dfrac acsinAca​sin⁡θyr\sin \theta\dfrac yrsinθry​余弦cos⁡Abc\cos A\dfrac bccosAcb​cos⁡θxr\cos \theta\dfrac xrcosθrx​正切tan⁡Aab\tan A\dfrac abtanAba​tan⁡θyx\tan \theta\dfrac yxtanθ…

mysql中常用命令完整大全 适用于mysql8.0

关于安装部分就去看其他人的一些文章即可网上太多&#xff0c;这篇文章主要就是记录本人的一些关于mysql操作上的笔记。 mysql中常用命令1.登录数据库2.查看当前数据库3.创建数据库4.删除数据库5.创建表user基于以下条件6.使用主键约束7.指定非空8.唯一约束9.默认约束10.设置表…

物联网时代下的5G融合定位,可以实现哪些功能?

5G具有高带宽、高频谱&#xff08;毫米波&#xff09;、多天线阵列等特性&#xff0c;通过提升无线定位算法的能力、室内数字系统建设、完善5G定位服务流程以及与其它定位技术和平台的结合&#xff0c;可提高5G定位精度。室内高精度定位服务为5G定位扩展到更多应用场景和领域构…

C++:类和对象:运算符重载

前言&#xff1a; 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。 1&#xff1a;加号运算符重载 对于内置的数据类型&#xff0c; 编译器知道如何运算&#xff0c;可以很直观的得到结果 int a 10; …

西瓜书-支持向量机

支持向量机 支持向量:距离超平面最近的这几个训练样本点。 支持向量机的核心思想是最大化间隔γ2∣∣w∣∣\gamma \frac{2}{||w||}γ∣∣w∣∣2​。 求极大转换为求极小&#xff0c;转化为凸规划问题。 对偶问题 利用拉格朗日乘子法&#xff0c;对于不等式约束&#xff0c;…

安全网络身份认证系统的设计与实现

本文章源码地址&#xff1a;https://gitee.com/sukels/shirohttps://gitee.com/sukels/shiro 摘 要 随着互联网的飞速发展,Web应用的安全问题日益凸显。为了保护Web应用中用户和企业的敏感信息,认证授权加密已经成为了Web应用中不可缺少的部分。但是随之而来是巨大的代码工作…

欧科云链半年报解读Final

欧科云链半年报解读&#xff1a;净利润同比扭亏为盈&#xff0c;区块链大数据等创新业务贡献新增长曲线 日前&#xff0c;欧科云链控股&#xff08;01499.HK&#xff09;发布2022年度截至9月30日止的六个月中期报告。报告显示&#xff0c;公司在2022年4月1日至2022年9月30日实现…

【idea插件】EasyCode介绍与使用

1.简介 EasyCode是idea的一个插件,主要功能是代码生成,类似的插件还有jpa support EasyCode是idea的一个插件&#xff0c;可以采用图形化的方式对数据的表生成entity,controller,service,dao,mapper……无 需任何编码&#xff0c;简单而强大。可以大幅度的提高开发效率.下面来…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.7 DiameterSymbol

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points UG/NX二次…

第三章:远程登陆Linux系统-[实操篇]

一&#xff1a;为什么需要远程登陆Linux 1.1示意图 1.2说明 说明: 公司开发时候&#xff0c; 具体的情况是这样的 1) linux 服务器是开发小组共享的. 2) 正式上线的项目是运行在公网的. 3) 因此程序员需要远程登录到 centos 进行项目管理或者开发. 4) 画出简单的网络拓扑…

Vue3——路由的query参数和命名路由以及默认插槽slot的使用

这里主要在message页面组件和detail页面组件介绍 看一个案例&#xff0c;当一个二级路由下面又有许多个不同的跳转页面的时候&#xff0c;比如下图的about/message/detail , 需要分别展示多条信息&#xff0c;这里不能给每一条信息都配置一个组件&#xff0c;那样当信息的数量…