您现在的位置是:首页 > 正文

安卓实现播放器app

2024-04-01 03:27:45阅读 1

安卓给app提供了:

MediaPlayer:播放视频或音频功能,详见谷歌MediaPlayer文档

借助MediaPlayer,我们可以轻松的实现一个简单的播放器app。一般来说app显示内容放在Activity中。但是试想一般的播放器要求app进入后台后可以继续播放声音,app回到前台后可以继续播放视频。因此其实MediaPlayer更适合放在Service中来播放视频,而我们的Activity仅显示视频即可。接下来我们依次实现MediaService和MediaActivity。

首先实现我们的核心类MediaService:

class MediaService : Service() {
   
    val mMediaPlayer = MediaPlayer()  // 播放媒体文件的对象
    val mMediaBinder = MediaBinder()  // 传给Activity,使得Activity可以与我们这个Service通信
    var mIsForeground = false  // 为true时变成前台服务,为false时停止前台服务成为一般的后台服务
    var mMediaListener: MediaListener? = null  // mMediaPlayer的相关回调
    var mTimer: Timer? = null  // 用来定时调用mMediaListener.onProgress回调方法的定时器
    var mTimerTask = object : TimerTask() {
     // 定时调用mMediaListener.onProgress回调方法的任务
        override fun run() {
   
            mMediaListener?.onProgress(mMediaPlayer.currentPosition, mMediaPlayer.duration)
        }
    }

    // 此类的方法都是从Activity调用的
    inner class MediaBinder : Binder() {
   
        // 设置显示视频的surfaceHolder
        fun setDisplay(surfaceHolder: SurfaceHolder?) {
   
            mMediaPlayer.setDisplay(surfaceHolder)
        }

        // 设置一个额外的媒体播放完毕时回调
        fun setMediaListener(mediaListener: MediaListener?) {
   
            mMediaListener = mediaListener
            mMediaPlayer.setOnVideoSizeChangedListener(mMediaListener)
            if (mMediaListener == null) {
   
                mTimer?.cancel()
                mTimer = null
            } else if (mTimer == null) {
   
                mTimer = Timer().apply {
    schedule(mTimerTask, 0, 100) }
            }
        }

        // 打开媒体文件
        fun open(uri: Uri) {
   
            mMediaPlayer.reset()
            mMediaPlayer.setDataSource(this@MediaService, uri)
            mMediaPlayer.prepareAsync()
        }

        // 继续或暂停播放媒体,返回true代表继续播放了,返回false代表暂停播放了
        fun playOrPause(): Boolean {
   
            if (mMediaPlayer.isPlaying) mMediaPlayer.pause()
            else mMediaPlayer.start()
            updateServiceState()
            return mMediaPlayer.isPlaying
        }

        // 停止播放媒体
        fun stop() {
   
            mMediaPlayer.stop()
            updateServiceState()
        }

        // 调整播放进度
        fun seekTo(millisecond: Int) {
   
            mMediaPlayer.seekTo(millisecond)
        }
    }

    override fun onBind(intent: Intent): IBinder {
   
        return mMediaBinder
    }

    override fun onCreate() {
   
        super.onCreate()

        mMediaPlayer.setOnPreparedListener {
   
            mMediaPlayer.start()
            updateServiceState()
        }
        mMediaPlayer.setOnCompletionListener {
   
            mMediaListener?.onCompletion(it)
            updateServiceState()
        }
        mMediaPlayer.setOnErrorListener {
    mp, what, extra ->
            Log.e(TAG, "MediaPlayer error! mediaPlayer=$mp, what=$what, extra=$extra")
            updateServiceState()
            true
        }
    }

    // 如果正在播放媒体文件,则变成前台服务,否则变成一般的后台服务
    private fun updateServiceState() {
   
        if (mMediaPlayer.isPlaying != mIsForeground) {
   
            mIsForeground = !mIsForeground
            

网站文章

  • idea创建SpringBoot项目报错解决方案

    idea创建SpringBoot项目报错解决方案

    idea创建SpringBoot项目报错解决方案

    2024-04-01 03:27:01
  • spring security 之 记住我功能

    spring security 之 记住我功能

    记住我基本原理UsernamePasswordAuthenticationFilter认证成功后会走successfulAuthentication方法 然后经过successfulAuthentic...

    2024-04-01 03:26:47
  • LeetCode 刷题记录(8,9,10)—Java语言

    8. 字符串转整数 (atoi) 题目 实现 atoi,将字符串转为整数。 在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。 字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它...

    2024-04-01 03:26:04
  • Redis持久化机制

    https://www.liangzl.com/get-article-detail-126557.html

    2024-04-01 03:25:58
  • 动态规划实现完全背包问题C++【求助】

    C++没学好,导致这学期的算法课程完全不行,想求一个大佬指导一下 #include #include using namespace std; struct articles // 定义物品结点 { int w; //重量 int v; //价值 }; class Knapsack //定义背包类 { public: Knapsack(int num,int wb); /

    2024-04-01 03:25:51
  • 关于清空浏览器中cookie中所有数据的内容信息

    关于清空浏览器中cookie中所有数据的内容信息

    清空浏览器中cookie中所有的数据信息内容,看到有很多是重写cookie中的信息,感觉不是多么合适,不适合自己使用方式,全部清空缓存信息需要删除里面的所有信息。在方法中直接添加该段代码就能清空cookie中所有的数据信息。

    2024-04-01 03:25:43
  • Es性能优化

    Es性能优化

    1. Es中10亿级别的数据量,如何提高查询效率(1) 性能优化关键:file system cachea. 不要期待随手挑一个参数,就可以万能的应对所有性能慢的场景b. es依赖于底层的file system cache,如果给file system cache更多的内存,尽量让内存容纳所有的idx segment file索引数据文件,则搜索时均走内存,性能很高。如果内存...

    2024-04-01 03:25:03
  • 【前端】IIS部署前端

    【前端】IIS部署前端

    3.双击“Application Request Routing”,在右侧操作中点击“Proxy”中的“Server Proxy Settings...”,然后将“Enable proxy”打上勾即可...

    2024-04-01 03:24:55
  • Nacos系列-Nacos配置中心

    Nacos系列-Nacos配置中心

    接下来本系列博客将会整理Nacos的相关知识,主要将会涉及到 服务注册与发现、配置管理、分布式系统个、高可用和容错性、配置文件格式和解析几个方面。今天就先从配置管理讲起,看看如何使用nacos的配置管理,它能够给我们带来什么~Nacos(全名为阿里巴巴中间件 NACOS,前身为阿里巴巴注册中心和配置中心)是一款用于实现微服务架构中配置管理和服务发现的开源产品。

    2024-04-01 03:24:46
  • 有关import sun.audio.AudioPlayer(或者其它文件)的问题

      今天白天在工作中使用Eclipse编译代码的时候,在播放声音的代码中报了这么一个错误   import sun.audio.AudioPlayer;   import sun.audio.AudioStream;   上面这两句都报“Access restriction: The type AudioPlayer is not accessible due to restrictio...

    2024-04-01 03:24:05