【问题标题】:Android MediaPlayer in it's own class causing app crashAndroid MediaPlayer 在它自己的类中导致应用程序崩溃
【发布时间】:2016-11-06 16:58:58
【问题描述】:

我为 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 类是创建媒体播放器以及启动和停止媒体播放器的位置。

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:致命异常:主要 进程:com.example.sam.myfirstapp,PID:2395 java.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.invoke(本机方法) 在 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.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

【问题讨论】:

标签: java android crash


【解决方案1】:

错误是你没有在音乐类中初始化上下文的空上下文。

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

【讨论】:

    【解决方案2】:

    您的context 变量是null;你从来没有设置它。

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 2014-05-08
      • 2013-12-02
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      相关资源
      最近更新 更多