草庐IT

Android MediaPlayer调用raw/assets/uri 三种资源实现音频播放

Android_馒头 2024-07-26 原文

MediaPlayer Android 体统的播放流媒体文件的工具类,项目需要播放音频,特此简单记录一下音频播放的方法调用

####1. MediaPlayer支持:AAC、AMR、FLAC、MP3、MIDI、OGG、PCM等格式

####2. MediaPlayer 方法调用

  • MediaPlayer() ,MediaPlayer.create(mContext, rawRes) 初始化方法 注意:MediaPlayer.create() 方法内部调用了prepare 方法 所以直接start()就行 多次调用会异常

  • setDataSource() 设置资源

  • setOnCompletionListener() 完成的监听

  • setOnErrorListener()播放异常的监听

  • setOnPreparedListener() 准备完成的监听

  • start() 开始播放

  • pause() 暂停

  • release() 销毁

三种资源实现播放:

工具类

package com.wu.material.util
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.AssetFileDescriptor
import android.media.AudioManager
import android.media.MediaPlayer
import android.net.Uri
import android.os.Build
import androidx.annotation.RequiresApi

/**
 * 音频播放
 */
@SuppressLint("StaticFieldLeak")
object MediaPlayerUtil {

    private var mContext: Context? = null
    var mPlayer: MediaPlayer? = null

    private var isPause = false

    private var isPlaying = false

    fun isPlaying(): Boolean {
        return isPlaying
    }

    fun initMedia(mContext:Context,rawRes: Int) {
        mPlayer = MediaPlayer.create(mContext, rawRes)
        mPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
    }

    @RequiresApi(Build.VERSION_CODES.N)
    fun initMedia(mContext:Context, fad: AssetFileDescriptor) {
        mPlayer = MediaPlayer()
        mPlayer!!.setDataSource(fad)
    }

    fun initMedia(mContext:Context,path: String) {
        mPlayer = MediaPlayer()
        mPlayer!!.setDataSource(path)
    }

    fun initUriMedia(mContext:Context,uriPath: String) {
        mPlayer = MediaPlayer()
        mPlayer!!.setDataSource(mContext!!, Uri.parse(uriPath))
        mPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
    }

    fun setMediaListener(listener: MediaPlayerListener) {
        mPlayer!!.setOnCompletionListener {
            isPlaying = false
            listener.finish()
        }

        mPlayer!!.setOnErrorListener { mp, what, extra ->
            isPlaying = false
            listener.onErr(what)
            false
        }
        mPlayer!!.setOnPreparedListener {
            listener.prepare()
        }
    }

    fun playMedia() {
        if (mPlayer != null && !mPlayer!!.isPlaying) {
            mPlayer!!.start()
        }
    }

    fun prepare() {
        if (mPlayer != null && !mPlayer!!.isPlaying) {
            mPlayer!!.prepare()
        }
    }

    fun prepareAsync() {
        if (mPlayer != null && !mPlayer!!.isPlaying) {
            mPlayer!!.prepareAsync()
        }
    }

    fun pause() {
        if (mPlayer != null && mPlayer!!.isPlaying) {
            mPlayer!!.pause()
            isPause = true
        }
    }

    // 继续
    fun resume() {
        if (mPlayer != null && isPause) {
            mPlayer!!.start()
            isPause = false
        }
    }

    fun release() {
        if (mPlayer != null) {
            try {
                mPlayer!!.a's'()
            } catch (e: Exception) {
            }
            mPlayer = null
        }
        isPlaying = false
    }

}

注意:MediaPlayer.create() 内部已调用 mp.prepare()

####1.引用raw 的资源播放音频

        MediaPlayerUtil.initMedia(this,R.raw.audio)
        MediaPlayerUtil.setMediaListener(object :MediaPlayerListener{
            override fun onErr(messageCode: Int) {
            }

            override fun finish() {
            }

            override fun prepare() {
            }
        })

        MediaPlayerUtil.playMedia()

####2.引用assets的资源播放音频

 var fikkDes= assets.openFd("audio.mp3") as AssetFileDescriptor
        MediaPlayerUtil.initMedia(this,fikkDes)
        MediaPlayerUtil.setMediaListener(object :MediaPlayerListener{
            override fun onErr(messageCode: Int) {
            }

            override fun finish() {
            }
            override fun prepare() {
                MediaPlayerUtil.playMedia()
            }
        })
        MediaPlayerUtil.prepareAsync()

####3.引用网络资源播放音频

   var path="https://downsc.chinaz.net/Files/DownLoad/sound1/202103/s1024.mp3"
    private fun playRawUri() {
        MediaPlayerUtil.initMedia(this,path)

        MediaPlayerUtil.setMediaListener(object :MediaPlayerListener{
            override fun onErr(messageCode: Int) {
            }

            override fun finish() {
            }
            override fun prepare() {
                MediaPlayerUtil.playMedia()
            }
        })
        MediaPlayerUtil.prepareAsync()
    }

总结

如有帮助欢迎点赞, 源码地址

本文由博客一文多发平台 OpenWrite 发布!

有关Android MediaPlayer调用raw/assets/uri 三种资源实现音频播放的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  4. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  8. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐