2016-11-06 2 views
0

Я создал класс для MediaPlayer, чтобы я мог получить к нему доступ из нескольких классов, так как мне нужно запустить медиа в один раз и остановить его в другом. При попытке вызвать mediaPlayer я получаю сообщение об ошибке. Я не понимаю, где я ошибаюсь, поскольку я не совсем понимаю ошибку. Перед созданием класса для MediaPlayer он работал, но он не позволял мне делать то, что я хотел. Может ли кто-нибудь посоветовать мне, как решить мою проблему или другой способ доступа к MediaPlayer. Заранее спасибо.Android 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(); 
    } 
} 

--------- начало аварии Х/AndroidRuntime: неустранимый: Основной процесс: com.example.sam.myfirstapp, ПИД: 2395 Java .lang.RuntimeException: Невозможно запустить Activity ComponentInfo {com.example.sam.myfirstapp/com.example.sam.myfirstapp.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.res.Resources android .content.Context.getResources() 'в ссылке нулевого объекта на android.app.ActivityThread.performLaunchActiv (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) at java.lang.reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:865) at com.android.internal. os.ZygoteInit.main (ZygoteInit.java:755) Вызвано: java.lang.NullP ointerException: попытка вызвать виртуальный метод 'android.content.res.Resources android.content.Context.getResources()' в ссылке нулевого объекта на android.media.MediaPlayer.create (MediaPlayer.java:931) на android. media.MediaPlayer.create (MediaPlayer.java:914) at com.example.sam.myfirstapp.Music.menuSound (Music.java:21) at 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) at java.lang.reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:865) at com.android.internal.os .ZygoteInit.main (ZygoteInit.java:755)

+0

Возможный дубликат [? Что такое NullPointerException, и как это исправить] (http://stackoverflow.com/questions/218384/what -is-а-NullPointerException-и-как-делать-я-Fix-It) – pathfinderelite

ответ

0

Ошибка с нулевым контекстом, в котором вы не инициализировали контекст в музыкальном классе.

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

Ваш context переменная null; вы никогда не устанавливали его.

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

Кроме того, поскольку вы используете MediaPlayer на нескольких мероприятиях, убедитесь, что вы используете контекст приложения, чтобы избежать утечки контекста.

menu = MediaPlayer.create(context.getApplicationContext(), R.raw.menumusic); 
Смежные вопросы