今天呢我们主要学习
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)
}
}
最后就可以实现点击切歌啊,上一首下一首,暂停等等功能了