簡體   English   中英

為什么在嘗試實例化 Mediaplayer 時會出現 NullPointerException? 安卓科特林

[英]Why do I get NullPointerException when trying to instantiate Mediaplayer? Android Kotlin

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:嘗試在空對象引用上調用虛擬方法“android.content.res.Resources android.content.Context.getResources()”

我已將這段代碼從它工作的獨立應用程序移到另一個應用程序的此類中。 現在它不起作用,我不明白為什么。 MediaPlayer.Create() 方法將上下文(我從調用此類的 MainActivity 類傳遞)和要播放的音頻文件的 uri 作為參數。 它們都不為空。

為什么我會得到這個異常?

編輯:

創建 SoundGenerator 的唯一位置是在 MainActivity Initializer 中:

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而不是當前活動作為適當的上下文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM