Kotlin MediaPlayer的简单使用

3

我是Kotlin的新手,正在尝试制作一个简单的音频管理器(包装MediaPlayer)。

我想要这个类来播放音频。

这是我的类:

package com.example.myappname

import android.media.MediaPlayer

interface AudioManagerInput {
    fun startSound()
    fun stopSound()
}

class AudioManager: AudioManagerInput {

    // Instance variables

    private var mediaPlayer: MediaPlayer? = null

    // AudioManagerInput methods

    override fun startSound() {
        if (mediaPlayer == null) {
            mediaPlayer = MediaPlayer()
            mediaPlayer?.setDataSource("R.raw.songone") // ???
        }
        mediaPlayer?.start()
    }

    override fun stopSound() {
        mediaPlayer?.stop()
    }
}

我遇到了设置歌曲的问题。

我想要加载一个本地文件 R.raw.songone,它是一个位于 res/raw 目录下的 .wav 文件。

如何获取一个字符串到它的路径?

我查阅了一些教程,其中提供了使用 MediaPlayer 的其他解决方案,但我遇到了一些问题,比如不知道要导入什么,无法调用 create 方法,或者找不到 context(不知道这是什么)。


这段代码应该放在 MainActivity.kt 文件中还是单独的类/文件中? - Miles Morales
1个回答

3

将Context导入AudioManager:

import android.content.Context

修改类或其方法签名如下:

class AudioManager(private val context: Context): AudioManagerInput

现在我们可以向 MediaPlayer 传递上下文:

override fun startSound() {
    if (mediaPlayer == null) {
        mediaPlayer = MediaPlayer.create(context, R.raw.yourSound);
    }
    mediaPlayer?.start()
}

从Activity中初始化您的AudioManager:

var audioManager = AudioManager(this)

要手动访问raw文件,请按名称从res/raw读写

我该如何从调用类中传递上下文?class MainActivity : AppCompatActivity() - Chris Allinson
2
AudioManager(this) - Taseer
我已经按照这种方式创建了对象,并且使用伴生对象{ var mediaPlayer: MediaPlayer? = null }将对象保持为静态,几秒钟后通过GC清除。仅供参考.. - ayciceksamet
不是一个好的方法,我不知道你如何使用这个对象,根据你的评论,我宁愿将它移动到前台服务。 - Taseer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接