添加依赖 implementation "org.jetbrains.anko:anko:0.10.8"
class home_frame : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val inflate = LayoutInflater.from(context).inflate(R.layout.home_frame, null)
val recy = inflate.findViewById<RecyclerView>(R.id.recy)
var resolver = context!!.contentResolver
//开启子线程进行处理
//把RecyclerView作为参数进行传入
MediaTask(recy, context!!).execute(resolver)
return inflate
}
class MediaTask(recy: RecyclerView, context: Context) : AsyncTask<ContentResolver, Int, Cursor>() {
val rv_container = recy
val context = context
//子线程
override fun doInBackground(vararg params: ContentResolver?): Cursor {
var resolver = params[0]
var cursor = resolver!!.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
arrayOf(
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.ARTIST
), null, null, null
)
return cursor
}
override fun onPostExecute(cursor: Cursor?) {
super.onPostExecute(cursor)
cursor!!.moveToPosition(-1)
var musicList = ArrayList<MusicBean>()
//把查询完毕的数据放入集合
while (cursor!!.moveToNext()) {
var data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))//播放Uri
var displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME))//默认名称
var size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE))//大小
var artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))//歌手
//把内容条目进行填充
musicList.add(MusicBean(data, displayName, size, artist))
}
rv_container.setLayoutManager(LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false))
var musicAdapter = MusicAdapter(R.layout.recyclerview_music_item, musicList)
rv_container.setAdapter(musicAdapter)
//条目点击事件,跳转音乐播放界面
musicAdapter.setOnItemClickListener { adapter, view, position ->
context.startActivity<AudioActivity>(
"musicList" to musicList,
"position" to position
)
}
}
}
}
bean类
data class MusicBean(var data: String, var displayName: String, var size: String, var artist: String):Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(data)
parcel.writeString(displayName)
parcel.writeString(size)
parcel.writeString(artist)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MusicBean> {
override fun createFromParcel(parcel: Parcel): MusicBean {
return MusicBean(parcel)
}
override fun newArray(size: Int): Array<MusicBean?> {
return arrayOfNulls(size)
}
}
}
适配器
class MusicAdapter(layoutResId: Int, data: MutableList<MusicBean>?) :
BaseQuickAdapter<MusicBean, BaseViewHolder>(layoutResId, data) {
override fun convert(helper: BaseViewHolder?, item: MusicBean?) {
helper!!.setText(R.id.tv_music_item_right, item!!.displayName)
}
}
AudioActivity
class AudioActivity : AppCompatActivity() {
val musicService = MusicService()
//连接对象
val connection by lazy { MyConnection() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_audio)
//音乐条目的集合
var musicList = intent.getParcelableArrayListExtra<MusicBean>("musicList")
var position = intent.getIntExtra("position", -1)
//获取Service
//var musicService = MusicService()
//Intent值传入到Service中
var intent = Intent(this, musicService.javaClass)
intent.putExtra("musicList", musicList)
intent.putExtra("position", position)
//开启服务
this.startService(intent)
//绑定
this.bindService(intent, connection, Context.BIND_AUTO_CREATE)
//MediaPlayer
/* var mediaPlayer = MediaPlayer()
//准备
mediaPlayer.setOnPreparedListener {
mediaPlayer.start()
}
//关键方法:需要设置播放的路径Uri
mediaPlayer.setDataSource(musicList.get(position).data)
mediaPlayer.prepareAsync()*/
}
class MyConnection : ServiceConnection {
/**
* 服务断开时
*/
override fun onServiceDisconnected(name: ComponentName?) {
}
/**
* 服务连接时
*/
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
}
}
}
musicService
class MusicService:Service() {
//音乐播放器
var mediaPlayer: MediaPlayer? = null
//音乐集合
var musicList: ArrayList<MusicBean>? = null;
//位置
var position: Int = 0
//加载
var binder: MusicService.InnerBinder = InnerBinder()
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//对音乐集合和位置的接收
musicList = intent?.getParcelableArrayListExtra<MusicBean>("musicList")
position = intent?.getIntExtra("position", -1)!!
//播放
binder.playItem()
return super.onStartCommand(intent, flags, startId)
}
override fun onBind(intent: Intent?): IBinder {
return binder
}
/**
* 最核心的部分
*/
inner class InnerBinder : Binder(), MediaPlayer.OnPreparedListener {
override fun onPrepared(mp: MediaPlayer?) {
//准备好做什么,由用户决定
mediaPlayer?.start()
}
//播放条目音乐
fun playItem() {
//获取MediaPlayer
mediaPlayer = MediaPlayer()
mediaPlayer!!.setOnPreparedListener(this)
//获取播放路径
mediaPlayer!!.setDataSource(musicList?.get(position)!!.data)
mediaPlayer?.prepareAsync()
}
}
}