package com.oyly.gpsdemo
import android.content.Context
import android.media.MediaPlayer

class SoundGenerator(context: Context) : MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {
    private var mediaPlayer:    MediaPlayer = MediaPlayer()
    private var nextSound:      Int = R.raw.coast

    init {
        try { mediaPlayer = MediaPlayer.create(context, R.raw.coast) }
        catch (ex : Exception) { println("lyseoy11: $ex") }
            mediaPlayer.setOnPreparedListener(this)
            mediaPlayer.setOnCompletionListener (this)
    }
        override fun onPrepared(p0: MediaPlayer) {mediaPlayer.start()}
        override fun onCompletion(p0: MediaPlayer?) { playSound() }
        fun queueSound(resid: Int) {
            nextSound = resid
            if (!mediaPlayer.isPlaying) playSound()
        }
        fun playSound() {
            mediaPlayer.reset()
            mediaPlayer.setDataSource(resources.openRawResourceFd(nextSound))
            mediaPlayer.prepareAsync()
        }
}

"mediaPlayer=mediaPlayer.create(context,R.raw.coast)"行引发以下异常:

Java语言lang.NullPointerException:try 调用虚拟方法"android".所容纳之物资源android.所容纳之物上下文空对象引用上的getResources()

我已经将这段代码从一个独立的应用程序中移到了另一个应用程序的这个类中.现在它不起作用了,我不明白为什么.MediaPlayer.Create()方法将上下文(我从调用该类的MainActivity类传递)和要播放的音频文件的uri作为参数.它们都不为null.

为什么会出现此异常?

Edit:

创建SoundGenerator的唯一位置是在MainActivity初始值设定项中:

class MainActivity : AppCompatActivity() {
    private             var soundGenerator : SoundGenerator = SoundGenerator(this)
    ...
}

推荐答案

通常,最好等到生命周期的晚些时候(例如,在onCreate中)完成设置后再将活动用作上下文,以避免初始化顺序问题.例如:

class MainActivity : AppCompatActivity() {
    private lateinit var soundGenerator : SoundGenerator

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //...
        soundGenerator = SoundGenerator(this)
    }
}

或者,有时您可以使用applicationContext而不是当前活动作为适当的上下文.

Android相关问答推荐

在Jetpack Compose中,material 3 Textfield上的底部边框 colored颜色 是如何更改的?

我到底应该如何分享我的应用程序中的图片?

如何在Android Studio的LinearLayout中禁用阴影

不能有意地从一个活动的可组合功能转移到另一个活动

由于Xcode运行脚本阶段没有指定输出,在IOS Emulator中的KMM项目中生成失败

如何检测低性能 Android 设备进行条件动画渲染?

如何在卡片视图右侧添加箭头

当父布局的背景为浅色时,Android ProgressBar 背景 colored颜色 变为灰色

从 HiltViewModel @Injection 访问 Application()

java.lang.ExceptionInInitializerError -- 原因:java.lang.NullPointerException

状态更改后 colored颜色 未正确更改

如何在 Compose 中使用合并的单元格创建网格视图?

Jetpack Compose Material3 禁用 ListItem

如何将设备屏幕位置转换为发送事件位置?

如何在 TextInputEdit 中调整可绘制对象的大小

在 android list 中添加 IsMonitoringTool 元数据标志的位置

单击登录按钮后从应用程序中退出

在jetpack compose中看不到圆角

为什么在try 实例化 Mediaplayer 时会出现 NullPointerException?安卓Kotlin

WearOS - 有没有办法从心电图传感器收集原始数据?