首页 > 解决方案 > 启动应用时自动播放音乐

问题描述

我想知道如何在启动应用程序时自动播放音乐,以及如何在按下主页按钮时使其停止在后台播放。现在,它通过按下切换按钮启动和停止。我还想知道是否可以在进行其他活动时自动切换到其他音乐?

MainActivity.kt

 private lateinit var player: MediaPlayer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val secondActivity = findViewById<Button>(R.id.secondActivity)
        secondActivity.setOnClickListener {
            val intent = Intent(this, MainActivity2::class.java)
            startActivity(intent)
        }

        val toggle: ToggleButton = findViewById(R.id.toggleButton)
        toggle.setOnCheckedChangeListener { _, isChecked ->
            val svc = Intent(this, MusicService::class.java)
            if (isChecked) {
                startService(svc)
            } else {
                stopService(svc)
            }
        }
    }

音乐服务.kt

class MusicService : Service() {

    private lateinit var player: MediaPlayer

    override fun onBind(intent: Intent?): IBinder? {
        TODO("Return the communication channel to the service.")
        return null
    }

    override fun onCreate() {
        super.onCreate()
        player = MediaPlayer.create(this, R.raw.music)
        player.setLooping(true)
    }

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

    override fun onDestroy() {
        super.onDestroy()
        player.stop()
    }

}

标签: androidkotlin

解决方案


根据您的具体要求,您应该或不应该使用 aMediaService作为解决方案的一部分。

更清楚地说,Service仅当您希望音频在您在应用程序之外时继续播放时才应使用。此解决方案通常会附带一个媒体通知,您应该在其中填充控件、图像资产等。(想想 Spotify 或 SoundCloud)如果这是您正在寻找的解决方案,请查看 Google 的此文档页面和跟随它。请注意,这是一个更长、更难维护的过程。

另一方面,如果您只想在用户在您的应用程序内时播放音乐/声音,那么一个简单的

private lateinit var localMedia: MediaPlayer

override fun onCreate() {
    ...
    localMedia = MediaPlayer.create(context, R.raw.your_audio_file)
}

override fun onResume() {
    ...
    localMedia.start()
}

override fun onPause() {
    ...
    localMedia.release()
}

此外,如果您希望在不同的活动/片段上播放不同的音频文件,您可能希望将我上面提供的代码抽象到它自己的 Manager 类中,并以相同的方式访问它,但更改特定的 .mp3 文件(或任何格式) 你认为合适的。

编辑:

对于 Manager 类,您必须创建自己的函数并处理其MediaPlayer内部

private class MediaPlayerManager(private val context: Context) {

private lateinit var mediaPlayer: MediaPlayer

fun setupPlayer() {
    mediaPlayer = MediaPlayer.create(context, R.raw.your_audio_file)
}

fun play() {
    mediaPlayer.start()
}

fun stop() {
    mediaPlayer.stop()
}
}

并根据您的特定需求,从您的 Activity/Fragment 中它们各自的生命周期方法调用这些函数

class YourActivity {

val mediaPlayerManager = MediaPlayerManager(context)

override onCreate() {
    ...
    mediaPlayerManager.setupPlayer()
}

override fun onResume() {
    ...
    mediaPlayerManager.play()
}

override fun onPause() {
    ...
    mediaPlayerManager.stop()
}
}

我应该补充一点,我不一定在这里提供一个完整的答案,而是您根据自己的需求进行按摩的起点。Manager 类不过是我试图传达的概念的抽象。MediaPlayer最后,如果您想在另一个 Activity/Fragment 中使用不同的音频资源文件,则必须创建一个方法来使用适当的文件重新分配其中的对象。例如

fun setupPlayer(audioRes: Int) {
    mediaPlayer = MediaPlayer.create(context, audioRes)
}

推荐阅读