首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启动应用时自动播放音乐

启动应用时自动播放音乐
EN

Stack Overflow用户
提问于 2020-12-19 02:35:02
回答 2查看 72关注 0票数 0

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

MainActivity.kt

代码语言:javascript
复制
 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

代码语言:javascript
复制
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()
    }

}
EN

回答 2

Stack Overflow用户

发布于 2020-12-19 02:49:15

根据您的特定需求,您应该或不应该将MediaService作为解决方案的一部分。

更清楚的是,只有当你想在应用程序之外的时候继续播放音频时,才应该使用Service。这个解决方案通常会伴随着一个媒体通知,你应该填充控件,图片资产等(想想Spotify或SoundCloud)如果这就是你正在寻找的解决方案,看看谷歌的这个doc page并进行到底。请注意,这是一个更长、更难维护的过程。

另一方面,如果你想做的就是在用户进入你的应用程序时播放音乐/声音,那么一个简单的

代码语言:javascript
复制
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

代码语言:javascript
复制
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()
}
}

并根据您的特定需求,从活动/片段中各自的生命周期方法中调用这些函数

代码语言:javascript
复制
class YourActivity {

val mediaPlayerManager = MediaPlayerManager(context)

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

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

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

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

代码语言:javascript
复制
fun setupPlayer(audioRes: Int) {
    mediaPlayer = MediaPlayer.create(context, audioRes)
}
票数 1
EN

Stack Overflow用户

发布于 2020-12-19 05:34:08

我以前也这么做过

创建一个类并将其命名为C(例如,我将其命名为C),并从Application扩展它,如下所示(别忘了在manifest.xml中将android:name=".C"放在<application>标记中):

代码语言:javascript
复制
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扩展所有活动

代码语言:javascript
复制
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
    */
    
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65362243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档