音乐播放

今天呢我们主要学习

MediaPlayer

这是一个音乐播放器的底层,如果你想深入的了解这个播放器,我可以给你举个例子,如果你学会了它,那网上的网yy音乐什么的都是弟弟,但换句话说,如果这些大公司比如网yy音乐没了这个,那它还是个弟弟,毕竟这是一个音乐播放器的基础

首先如何获得MediaPlayer实例:
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了

然后我们今天的做法是在Service中进行的,只是为了让这些工作可以在后台进行,哪怕当前activity被隐藏了,被暂停了,失去焦点了,歌依然是该播播

那么我们先看一下service类中的代码

class MyPlayer : Service() {
    companion object {
        var a = 0;
        var mediaPlayer:MediaPlayer? = null;
    }

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

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_REDELIVER_INTENT
    }

    inner class Mybinder : Binder() {
        fun getService(): MyPlayer {
            return this@MyPlayer
        }
    }

    fun bofang(music: Music,int: Int){

        if(mediaPlayer==null&&a!=int){
            mediaPlayer = MediaPlayer()
            a = int;
            mediaPlayer!!.setDataSource(music.data)
            mediaPlayer!!.prepare()
            mediaPlayer!!.start()
        }else{
            mediaPlayer!!.start()
        }


    }

    fun pause(){
            mediaPlayer!!.pause()
    }

    fun stop(){
        mediaPlayer = null;
    }
}

其中个int标签是为了判断在主界面操作的和现在操作的是否是同一首歌

然后呢就是获取本地中的音乐,需要在清单文件中加一行读的权限

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

然后就在主类中通过contentResolve查询,字段名请自行在代码中提取吧

 var musics :ArrayList<Music> = ArrayList();
        val arrayOf = arrayOf(MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA)
        val query = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, arrayOf, null, null, null);
        while(query.moveToNext()){
            var name = query.getString(query.getColumnIndex(MediaStore.Audio.Media.TITLE))
            var singer = query.getString(query.getColumnIndex(MediaStore.Audio.Media.ARTIST))
            var time = query.getString(query.getColumnIndex(MediaStore.Audio.Media.DURATION))
            var data = query.getString(query.getColumnIndex(MediaStore.Audio.Media.DATA))
            val music = Music(name, singer, time, data)

            musics.add(music)
            println("###"+music.toString())

        }

拿到本地歌曲之后,将他们放入listview中展示出来,布局适配器我就不展示出来了,我以前的博客里有,找一下吧反正我也挺懒的

最后就是操作了,坦白说我不知道我当时是怎么想的,大概思路就是每次传过去一个值在另一边进行比较,若相同则是操作一首歌的播放和停止,若是不相同则开始另外一首歌,并且改变标签
看代码吧我也说不明白

 viewHolder.choose!!.setOnClickListener {
                    if (i == 0){
                        i++;
                        MyPlayer.a = position-1
                        myPlayer?.bofang(musics[position],position)
                    }else{

                        if(MyPlayer.a == position){
                            if(MyPlayer.mediaPlayer!!.isPlaying){
                                myPlayer?.pause()
                            }else{
                                myPlayer?.bofang(musics[position],position)
                            }
                        }else{
                            myPlayer?.pause()
                            myPlayer?.stop()
                            println("###xxa="+MyPlayer.a)
                            println("###xxposition = "+position)
                            myPlayer?.bofang(musics[position],position)
                        }
                    }

最后再做上上一首和下一首的功能,关键在于判断当前歌曲在歌单中是第几个位置,需要对第一个和最后一个位置进行判断,防止数组下标越位

upsong.setOnClickListener {
            if (MyPlayer.a-1 != -1){
                myPlayer?.pause()
                myPlayer?.stop()

                myPlayer?.bofang(musics[MyPlayer.a-1],MyPlayer.a-1)
            }
        }
        downsong.setOnClickListener {
            if (MyPlayer.a != 3){
                myPlayer?.pause()
                myPlayer?.stop()

                myPlayer?.bofang(musics[MyPlayer.a+1],MyPlayer.a+1)
            }
        }

最后就可以实现点击切歌啊,上一首下一首,暂停等等功能了

INTERESTING!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值