3

I'm new to Kotlin and am trying to make a simple AudioManager (wrapping MediaPlayer).

I want the class to play the audio.

Here is my class:

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()
    }
}

I'm having issues setting the song.

I'm looking to load a local file R.raw.songone which is a .wav file sitting in res/raw.

How can I get a String to it's path?

I've scoured tutorials which hold other solutions to using MediaPlayer but have had issues with not knowing what to import, not being able to call create, or context not being found (whatever that is).

Chris Allinson
  • 1,837
  • 2
  • 26
  • 39

1 Answers1

3

Import Context into AudioManager:

import android.content.Context

Modify class or it's method signature like this:

class AudioManager(private val context: Context): AudioManagerInput

Now we can pass context to MediaPlayer:

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

To init your AudioManager from an Activity:

var audioManager = AudioManager(this)

To manually access raw files: Read/write from res/raw by name.

Chris Allinson
  • 1,837
  • 2
  • 26
  • 39
Taseer
  • 3,432
  • 3
  • 16
  • 35
  • How do I pass in the context from the calling class? `class MainActivity : AppCompatActivity()` – Chris Allinson Oct 06 '19 at 04:44
  • 2
    `AudioManager(this)` – Taseer Oct 06 '19 at 04:47
  • I have created like in this way and my object is cleared a few seconds with GC, keeping object static with companion object { var mediaPlayer: MediaPlayer? = null } is solved. fyi.. – ayciceksamet May 24 '20 at 14:06
  • Not a good approach, I don't know how you are using the object, judging from your comment I would rather move it to a foreground service. – Taseer May 24 '20 at 17:28