Jetpack сочиняет — пытается заставить звук воспроизводиться в режиме просмотра.

#kotlin #android-mediaplayer #android-jetpack

Вопрос:

Я пытаюсь воспроизвести звук за пределами @Copmosable из-за структуры моего приложения.

У меня есть процедура проверки, которая находится в моей модели представления, и на основе результата я хотел бы вызвать звук, но, похоже, я не могу заставить контекст работать вне @Composable

Я получаю следующую ошибку в модели MasterViewModel:

 None of the following functions can be called with the arguments supplied.
create(Context!, Uri!) defined in android.media.MediaPlayer
create(Context!, Int) defined in android.media.MediaPlayer
 

Любые указатели были бы вам очень благодарны!!

 package com.example.soundtest

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.example.soundtest.ui.theme.SoundTestTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            SoundTestTheme {
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
                    Greeting()
                }
            }
        }
    }
}

@Composable
fun Greeting(mastVM: MasterViewModel = MasterViewModel()) {
    Text("Play a sound...")
    mastVM.playSound()
    
}
 

и модель MasterViewModel

 package com.example.soundtest

import android.media.MediaPlayer

class MasterViewModel {

    fun playSound() {
        val mp: MediaPlayer = MediaPlayer.create(this, R.raw.correct)
    }
}
 

У меня есть правильное сохранение.mp3 в разделе res->raw-правильное.mp3

Ошибка MasterViewModel

Ответ №1:

У меня это работает!!!

Я просто включаю

 @Composable
fun Greeting(mastVM: MasterViewModel = MasterViewModel()) {
    val context = LocalContext.current
    Text("Play a sound...")
    mastVM.playSound(context: context)
    
}
 

а затем в модели MasterViewModel, как это

 fun playSound(context: Context) {
        val mp: MediaPlayer = MediaPlayer.create(context, R.raw.correct)
    }