Android 媒体播放器在它自己的类导致应用程序崩溃



我已经为MediaPlayer创建了一个类,这样我就可以从多个类访问它,因为我需要在一次活动中启动媒体并在不同的活动中停止它。当尝试调用mediaPlayer时,我得到一个错误。我不明白我在哪里出错了,因为我不完全理解这个错误。在为MediaPlayer创建类之前,它是工作的,但它不允许我做我想做的事情。有人能告诉我如何解决我的问题或访问MediaPlayer的不同方式吗?提前谢谢。

MainActivity类是我从哪里调用媒体播放器。

public class MainActivity extends AppCompatActivity {
    Music gm = new Music();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Display the Main Activity.
        setContentView(R.layout.activity_main);
        gm.menuSound(true);
    }
}

MediaPlayer类是创建媒体播放器以及启动和停止MediaPlayer的地方。

public class Music extends gameActivity{
    Context context;
    MediaPlayer menu;
    MediaPlayer soundtrack;
    MediaPlayer death;
    MediaPlayer start;
    public void menuSound(boolean x) {
        if(menu == null) {
            menu = MediaPlayer.create(context, R.raw.menumusic);
            menu.setVolume(100, 100);
        }
        if(x)
            menu.start();
        if(!x)
            menu.stop();
    }
}

---------崩溃开始E/AndroidRuntime: FATAL EXCEPTION: main过程:com.example.sam。myfirstapp, PID: 2395java.lang.RuntimeException:无法启动活动ComponentInfo{com.example.sam.myfirstapp/com.example.sam.myfirstapp。MainActivity}: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.content.res.Resources android.content.Context.getResources()'android.app.ActivityThread.performLaunchActivity (ActivityThread.java: 2646)android.app.ActivityThread.handleLaunchActivity (ActivityThread.java: 2707)android.app.ActivityThread.-wrap12 (ActivityThread.java)android.app.ActivityThread H.handleMessage美元(ActivityThread.java: 1460)android.os.Handler.dispatchMessage (Handler.java: 102)android.os.Looper.loop (Looper.java: 154)android.app.ActivityThread.main (ActivityThread.java: 6077)在java.lang.reflect.Method。调用(本地方法)com.android.internal.os.ZygoteInit MethodAndArgsCaller.run美元(ZygoteInit.java: 865)com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 755)由于:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.content.res.Resources android.content.Context.getResources()android.media.MediaPlayer.create (MediaPlayer.java: 931)android.media.MediaPlayer.create (MediaPlayer.java: 914)在com.example.sam.myfirstapp.Music.menuSound (Music.java: 21)在com.example.sam.myfirstapp.MainActivity.onCreate (MainActivity.java: 18)android.app.Activity.performCreate (Activity.java: 6664)android.app.Instrumentation.callActivityOnCreate (Instrumentation.java: 1118)android.app.ActivityThread.performLaunchActivity (ActivityThread.java: 2599)android.app.ActivityThread.handleLaunchActivity (ActivityThread.java: 2707)android.app.ActivityThread.-wrap12 (ActivityThread.java)android.app.ActivityThread H.handleMessage美元(ActivityThread.java: 1460)android.os.Handler.dispatchMessage (Handler.java: 102)android.os.Looper.loop (Looper.java: 154)android.app.ActivityThread.main (ActivityThread.java: 6077)在java.lang.reflect.Method。调用(本地方法)com.android.internal.os.ZygoteInit MethodAndArgsCaller.run美元(ZygoteInit.java: 865)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

错误是null上下文,您没有在音乐类中初始化上下文。

public class MainActivity extends AppCompatActivity { 
Music gm ;
@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    // Display the Main Activity. 
    setContentView(R.layout.activity_main); 
      gm = new Music(this); // pass context here to music  
    gm.menuSound(true); 
}

和音乐课:

public class Music extends gameActivity{ 
Context context;
MediaPlayer menu;
MediaPlayer soundtrack;
MediaPlayer death;
MediaPlayer start;
 public Music(Context context){
       this.context =context; // initialising context here
      }
public void menuSound(boolean x) {
    if(menu == null) { 
        menu = MediaPlayer.create(context, R.raw.menumusic); // here context was causing null pointer exception as context was null
        menu.setVolume(100, 100); 
    } 
    if(x) 
        menu.start(); 
    if(!x) 
        menu.stop(); 
}

您的context变量为null;你从来没设置过。

menu = MediaPlayer.create(context, R.raw.menumusic);

另外,由于你在多个活动中使用MediaPlayer,请确保使用应用程序上下文以避免上下文泄漏。

menu = MediaPlayer.create(context.getApplicationContext(), R.raw.menumusic);

最新更新