kotlin 如何将原始资源ID数据从Activity传递到服务?

kxkpmulp  于 2023-05-18  发布在  Kotlin
关注(0)|答案(2)|浏览(143)

我被要求显示歌曲列表,播放,暂停和停止只使用Android核心组件.
我已经设法显示歌曲列表。此外,我已经实现了播放/暂停/停止功能,但问题是,我只能播放硬编码的音乐文件。
这是我在Service类中的onCreate函数:

override fun onCreate() { 
     super.onCreate() 
     mediaPlayer = MediaPlayer.create(this,R.raw.sampl) 
     mediaPlayer.setOnCompletionListener { 
         stopSelf() 
     } 
 }

基本上,我的目标是能够用用户从片段中选择的原始文件夹中的任何其他文件更改R.raw.sampl。
这就是我在片段中演奏音乐的方式

binding.btnPlay.setOnClickListener {
            val intent = Intent(requireContext(), MusicService::class.java)
            intent.action = MusicService.ACTION_PLAY
            requireActivity().startService(intent)
        }
fykwrbwg

fykwrbwg1#

private fun listRaw() {
    val fields: Array<Field> = R.raw::class.java.fields
    for (count in fields.indices) {
        val resourceID = fields[count].getInt(fields[count])
    }
}

上面的代码可以用来列出raw文件夹中的所有文件,并使用资源ID在媒体播放器中播放它们。

mediaPlayer = MediaPlayer.create(this,resourceID)

resourceID将与R.raw.sampl相同
对于活动到服务的通信,建议使用绑定器。观看此video以更好地了解服务。
MyService类

class MyService : Service() {

    private val binder = MyServiceBinder()

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

    fun playMusic(ab: Int) {
        val mediaPlayer = MediaPlayer.create(this,ab)
        mediaPlayer.start()
    }

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

    inner class MyServiceBinder : Binder(){
        fun getService() = this@MyService
    }
}

而在活动中

private lateinit var myService: MyService
private val connection = object : ServiceConnection{
    override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
        val binder = p1 as MyService.MyServiceBinder
        myService = binder.getService()
    }

    override fun onServiceDisconnected(p0: ComponentName?) {

    }

}

override fun onStart() {
    super.onStart()
    Intent(this,MyService::class.java).also{
        bindService(it,connection,Context.BIND_AUTO_CREATE)
        startService(it)
    }
}

override fun onStop() {
    super.onStop()
    unbindService(connection)
}

和按钮点击或每当你想播放音乐。使用resourceID代替R.raw.ab

if (::myService.isInitialized) {
                myService.playMusic(R.raw.ab)
            }
hec6srdp

hec6srdp2#

你可以通过Intent将你的原始资源ID传递给你的服务:

binding.btnPlay.setOnClickListener {
    val intent = Intent(requireContext(), MusicService::class.java)
    intent.putExtra("playSong", R.raw.sampl)
    intent.action = MusicService.ACTION_PLAY
    requireActivity().startService(intent)
}

然后,在服务中获取您的资源ID:

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
   super.onStartCommand(intent, flags, startId)

   if (intent != null && intent.extras != null) {
      val songResId = intent.getIntExtra("playSong", -1)
    
      if (songResId != -1) {
         //play song
      }

相关问题