我想知道如何在启动应用程序时自动播放音乐,以及如何在按下主页按钮时停止在后台播放音乐。现在,它通过按下切换按钮来启动和停止。我还想知道是否有可能在参加其他活动时自动切换到其他音乐?
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)
}
}
}MusicService.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()
}
}发布于 2020-12-19 02:49:15
根据您的特定需求,您应该或不应该将MediaService作为解决方案的一部分。
更清楚的是,只有当你想在应用程序之外的时候继续播放音频时,才应该使用Service。这个解决方案通常会伴随着一个媒体通知,你应该填充控件,图片资产等(想想Spotify或SoundCloud)如果这就是你正在寻找的解决方案,看看谷歌的这个doc page并进行到底。请注意,这是一个更长、更难维护的过程。
另一方面,如果你想做的就是在用户进入你的应用程序时播放音乐/声音,那么一个简单的
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文件(或任何格式)。
编辑:
对于管理器类,您必须创建自己的函数并在其中处理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()
}
}并根据您的特定需求,从活动/片段中各自的生命周期方法中调用这些函数
class YourActivity {
val mediaPlayerManager = MediaPlayerManager(context)
override onCreate() {
...
mediaPlayerManager.setupPlayer()
}
override fun onResume() {
...
mediaPlayerManager.play()
}
override fun onPause() {
...
mediaPlayerManager.stop()
}
}我应该补充的是,我不一定要在这里提供一个完整的答案,而是一个起点,让您根据自己的需求进行推拿。Manager类只不过是我试图传达的概念的抽象。最后,如果您希望在另一个活动/片段中使用不同的音频资源文件,则必须创建一个方法来使用适当的文件重新分配其中的MediaPlayer对象。例如。
fun setupPlayer(audioRes: Int) {
mediaPlayer = MediaPlayer.create(context, audioRes)
}发布于 2020-12-19 05:34:08
我以前也这么做过
创建一个类并将其命名为C(例如,我将其命名为C),并从Application扩展它,如下所示(别忘了在manifest.xml中将android:name=".C"放在<application>标记中):
class C:Application() {
fun onCreate() {
super.onCreate()
context = getApplicationContext()
app = this
}
companion object {
private val context:Context
var currentActivity:Activity
var currentActivities:ArrayList<Activity> = ArrayList()
var handler:Handler
var app:C
fun get():C {
return app
}
fun getContext():Context {
if (currentActivity != null)
{
return currentActivity
}
return context
}
}
}我为AppCompatActivity的父类创建了一个类,并(名为UAppCompactActivity)从AppCompatActivity扩展它,然后从UAppCompactActivity扩展所有活动
abstract class UAppCompatActivity:AppCompatActivity() {
fun onCreate(@Nullable savedInstanceState:Bundle, @Nullable persistentState:PersistableBundle) {
super.onCreate(savedInstanceState, persistentState)
}
protected fun onResume() {
super.onResume()
C.setCurrentActivity(this)
C.currentActivities.add(this)
/* you can play your music here or do any action you desired */
}
protected fun onPause() {
super.onPause()
C.currentActivities.remove(this)
/*
you can stop your music here or do any action you desired
if (UBase.currentActivities.size() === 0)
G.backgroundMusics.get(G.app.musicNumberBackAndNowPlay).pause()
else
play music or switch to new music
*/
}
}https://stackoverflow.com/questions/65362243
复制相似问题