Skocz do zawartości
pawelz22

Dziwny problem z MediaPlayerem - NullPointerException

    Rekomendowane odpowiedzi

    Zmieniłem telefon na Xiaomi Redmi Note 7(Android 9) i chciałem sprawdzić jak radzi sobie na nim moja aplikacja i tu pojawił się problem, bo program wcale się nie uruchamia. Testowałem go na sporej liczbie telefonów(od Xiaomi też) i tabletów i nigdy nie było żadnego problemu.

    Dostaje taki błąd :

    E/AndroidRuntime: FATAL EXCEPTION: main
                      Process: aaa.aaa.aa, PID: 25635
                      java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.setOnCompletionListener(android.media.MediaPlayer$OnCompletionListener)' on a null object reference
                          at aaa.aaa.aa.MyActivity.prepare_media_minigun(MyActivity.java:6789)
                          at aaa.aaa.aa.MyActivity.onClick(MyActivity.java:4176)
                          at android.view.View.performClick(View.java:6608)
                          at android.view.View.performClickInternal(View.java:6585)
                          at android.view.View.access$3100(View.java:785)
                          at android.view.View$PerformClick.run(View.java:25921)
                          at android.os.Handler.handleCallback(Handler.java:873)
                          at android.os.Handler.dispatchMessage(Handler.java:99)
                          at android.os.Looper.loop(Looper.java:201)
                          at android.app.ActivityThread.main(ActivityThread.java:6810)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
    E/MQSEventManagerDelegate: failed to get MQSService.
    E/MediaPlayerNative: Unable to create media player
    D/MediaPlayer: create failed:
                   java.io.IOException: setDataSourceFD failed.: status=0x80000000
                       at android.media.MediaPlayer._setDataSource(Native Method)
                       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1304)
                       at android.media.MediaPlayer.create(MediaPlayer.java:998)
                       at android.media.MediaPlayer.create(MediaPlayer.java:971)

    Kod :

    static void prepare_media_minigun()
    {
    	
    	for(int i=0;i<minigun_max_ammo;i++)
    	{
    
    
    		media_minigun[i]=new  MediaPlayer();
    
    		if(minigun_silencer==false)
    		{
    		media_minigun[i]= MediaPlayer.create(context, R.raw.minigun);
    		}
    		else
    		{
    		media_minigun[i]= MediaPlayer.create(context, R.raw.minigun_ciszej);
    		}
    
    		media_minigun[i].setOnCompletionListener(new OnCompletionListener() {
               public void onCompletion(MediaPlayer mp) {
                    mp.release();
                };
           });
    	}
    	
    	minigun_player_unloaded=false;
    
    }

     

    Tablica MediaPlayerów:

    public static	MediaPlayer[] media_minigun = new MediaPlayer[100] ;

     

    Metoda prepare_madia_minigun() jest wywoływana w OnCreate().

     

    Może ktoś z was miał podobny problem, bo ja już nie mam pomysłu. Szczególnie że błąd nie występuje na o wiele słabszych telefonach. Wygląda na to że jest jakiś problem z wczytywaniem dźwięków z folderu raw.

    Z góry dzięki za pomoc

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    Czy ta linia:

    media_minigun[i]= MediaPlayer.create(context, R.raw.minigun);

    Lub ta:

    media_minigun[i]= MediaPlayer.create(context, R.raw.minigun_ciszej);

    tworzy w ogóle MediaPlayer? Sprawdź czy pod media_minigun jest instancja MediaPlayera. Ale najpierw powinieneś usunąć tą linię:
     

    media_minigun[i]=new  MediaPlayer();

    Jest ona całkowicie zbyteczna. Ponieważ i tak nadpisujesz media_minigun  przez wywołanie MediaPlayer.create.

     

    Cytat

    Szczególnie że błąd nie występuje na o wiele słabszych telefonach. Wygląda na to że jest jakiś problem z wczytywaniem dźwięków z folderu raw. 

    Możesz mieć racje. Problem stwarzać może nawet wersja androida, a zakładam że na tych słabszych nie było androida 9.0.

    Edytowane przez Coders Lab

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    9 godzin temu, Coders Lab napisał:

    tworzy w ogóle MediaPlayer? Sprawdź czy pod media_minigun jest instancja MediaPlayera.

    Tablica MediaPlayerów jest tworzona, ale pojedyncze MediaPlayery już nie. Przy próbie odtworzenia dźwięku dostaje NullPointerException i takie błędy: E/MediaPlayerNative: error (1, -2147483646).

    Co dziwne mam jeszcze 4 takie tablice i wypełniam je w ten sam sposób i tam błędu nie ma. Zauważyłem też że inne dźwięki np. z menu aplikacji też się nie odtwarzają ale błędu nie dają. Niektóre MediaPlayery działają inne nie.

    9 godzin temu, Coders Lab napisał:

    Możesz mieć racje. Problem stwarzać może nawet wersja androida, a zakładam że na tych słabszych nie było androida 9.0.

    Nie było, najwyższa wersja androida na innych urządzeniach na których testowałem była 8. Wygląda na to że aplikacja nie ma dostępu do wszystkich plików mp3 z raw 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    3 godziny temu, pawelz22 napisał:

    Wygląda na to że aplikacja nie ma dostępu do wszystkich plików mp3 z raw

    Żeby to sprawdzić możesz podmienić R.raw.minigunR.raw.minigun_ciszej na dźwięk który działa w innej części aplikacji. 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    1 godzinę temu, Coders Lab napisał:

    Żeby to sprawdzić możesz podmienić R.raw.minigunR.raw.minigun_ciszej na dźwięk który działa w innej części aplikacji. 

    Po podmianie dalej to samo.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Spróbuj utworzyć tylko jeden MediaPlayer w tej tablicy. 

    static void prepare_media_minigun()
    {
    	//tylko jeden
    	for(int i=0;i<1;i++)
    	{
    
    		media_minigun[i]= MediaPlayer.create(context, R.raw.minigun);
    	
    		media_minigun[i].setOnCompletionListener(new OnCompletionListener() {
               public void onCompletion(MediaPlayer mp) {
                    mp.release();
                };
           });
    	}
    	
    	minigun_player_unloaded=false;
    
    }

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    21 minut temu, Coders Lab napisał:

    Spróbuj utworzyć tylko jeden MediaPlayer w tej tablicy. 

    Jeden tworzy bez błędów.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    38 minut temu, pawelz22 napisał:

    Jeden tworzy bez błędów.

    Dobra, czyli mamy jakiś trop ;) Teraz można jeszcze zobaczyć czy z plikiem R.raw.minigun_ciszej też będzie działał dla jednego. Następnie można większą pętle puścić, tylko proponuję ją zrobić tak:

    for(int i=0;i<minigun_max_ammo;i++)
    	{
    		if(minigun_silencer==false)
    		{
    		media_minigun[i]= MediaPlayer.create(context, R.raw.minigun);
    		}
    		else
    		{
    		media_minigun[i]= MediaPlayer.create(context, R.raw.minigun_ciszej);
    		}
    
    		media_minigun[i].setOnCompletionListener(new OnCompletionListener() {
               public void onCompletion(MediaPlayer mp) {
                    mp.release();
                };
           });
    	}

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    Te same błędy. Teraz dodatkowo przestał działać kolejny MediaPlayer :

    MediaPlayer  mediaPlayer = MediaPlayer.create(GunsAnimatedWeaponsActivity.this, R.raw.kurtyna_down);
    						mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    							public void onCompletion(MediaPlayer mp) {
    								mp.release();
    
    							}
    
    							;
    						});
    						mediaPlayer.start();

    Wyrzuca błąd Null pointer exeption. Wygląda na to że Mediaplayery działają losowo i moja aplikacja na Androidzie 9 może utworzyć tylko jakąś ich liczbę.

    Niedawno przetestowałem aplikację na OnePlus 7 z androidem 9.0 i jest dokładnie tak jak na moim telefonie. Wygląda na to że problem występuje tylko na tej wersji androida.

    Edytowane przez pawelz22
    Nowe informacje

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    23 godziny temu, pawelz22 napisał:

    Wygląda na to że problem występuje tylko na tej wersji androida.

    Całe szczęście że androida 9 ma jeszcze dosyć mało urządzeń. Ale będzie się to zmieniać. Na niekorzyść Twojej aplikacji...
    Spojrzałem jeszcze w dokumentacje (https://developer.android.com/reference/android/media/MediaPlayer i https://developer.android.com/guide/topics/media/mediaplayer)   i znalazłem rzeczy które mogą Ci pomóc:

    1. zawsze po release(), trzeba ustawić zmienną na null:

    mp.release();
    mp = null;

    Nie wiem tylko jak to się zachowa gdy będziesz to wywoływał w metodzie onCompletion().

    2. Lepiej używać zawsze jednej instancji MediaPlayera - wykonywać na nim reset(), zamiast tworzyć nowe MediaPlayery.
    Wtedy możesz odtwarzać kolejne dźwięki w pętli w onCompletion()

    int i = 0
    mp.setOnCompletionListener(new OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mp.reset();
                if (i < 100) {
                    i++;
                  //zgodnie z tym: https://developer.android.com/reference/android/media/MediaPlayer#setDataSource(android.content.res.AssetFileDescriptor)
                  AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.minigun);
                  mp.setDataSource(file);
                  mp.prepared();
                  mp.start();            
                }
                else {
                  mp.release();
                  mp = null;
                }
            }


     

     

     

    • Piwko! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x