wake-up-neo.com

Media Player im Status 0 aufgerufen, Fehler (-38,0)

Ich versuche gerade, eine einfache App zu entwerfen, die einen Internetradiosender strahlt. Ich habe die URL für den Sender und setze den Media Player gerne ein

    MediaPlayer mediaPlayer = new MediaPlayer();
    try {
        mediaPlayer.setDataSource(URL);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.start();

Das Programm stürzt nicht ab, wenn es emuliert wird, aber es wird nichts abgespielt und es wird folgende Fehlermeldung angezeigt:

start called in state 0

und direkt darunter ist

Error (-38,0)

Weiß jemand was das bedeutet? 

Ich habe etwas über diese Zustandsfehler gelesen, aber nichts gefunden, das für mein Projekt zutreffend ist.

92
SmashCode

Sie müssen mediaPlayer.start() in der onPrepared-Methode aufrufen, indem Sie einen Listener verwenden. __ Sie erhalten diesen Fehler, weil Sie mediaPlayer.start() aufrufen, bevor der vorbereitete Status erreicht ist.

So kannst du es machen:

mp.setDataSource(url); 
mp.setOnPreparedListener(this);
mp.prepareAsync();

public void onPrepared(MediaPlayer player) {
    player.start();
}
103
user1492955

Es scheint, dass Fehler -38 eine Statusausnahme bedeutet (wie in der Fehlermeldung angegeben). Zum Beispiel, wenn Sie start() aufrufen, bevor der Song fertig war, oder wenn Sie pause() aufrufen, selbst wenn der Song überhaupt nicht abgespielt wird.

Um dieses Problem zu beheben, überprüfen Sie den Status des mediaPlayer, bevor Sie die Methoden aufrufen. Zum Beispiel:

if(mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
}

Darüber hinaus sendet der MediaPlayer Ereignisnachrichten. Selbst wenn Sie das vorbereitete Ereignis nicht benötigen (obwohl es eine gute Idee wäre, die Wiedergabe nicht zu starten, bevor dieses Ereignis ausgelöst wurde), müssen Sie einen Callback-Listener festlegen. Dies gilt auch für die Variablen OnErrorListener, OnCompletionListener, OnPreparedListener und OnSeekCompletedListener (wenn Sie die Suchmethode aufrufen).

Zuhörer können einfach per angeschlossen werden

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // Do something. For example: playButton.setEnabled(true);
    }
});
29
Alexander Pacha

Ich habe diese Fehlermeldung erhalten, als ich versuchte, die aktuelle Position (MediaPlayer.getCurrentPosition ()) des Media Players abzurufen, als sie nicht in der vorbereiteten Position angegeben war. Ich bin damit umgekommen, indem ich den Status nachverfolgt habe und die Methode getCurrentPosition () nur aufgerufen habe, nachdem onPreparedListener aufgerufen wurde.

10

Dies ist mein Code, getestet und funktioniert gut:

package com.example.com.mak.mediaplayer;

import Android.media.MediaPlayer;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.app.Activity;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final MediaPlayer mpp = MediaPlayer.create(this, R.raw.red); //mp3 file in res/raw folder

    Button btnplay = (Button) findViewById(R.id.btnplay); //Play
    btnplay.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View vone) {
        mpp.start();
      }
    });

    Button btnpause = (Button) findViewById(R.id.btnpause); //Pause
    btnpause.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View vtwo) {
        if (mpp.isPlaying()) {
          mpp.pause();
          mpp.seekTo(0);
        }
      }
    });
  }
}
7
MAK

ich habe den Code getestet. funktioniert gut 

public class test extends Activity implements OnErrorListener, OnPreparedListener {

private MediaPlayer player;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    player = new MediaPlayer();
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        player.setDataSource("http://www.hubharp.com/web_sound/BachGavotte.mp3");
        player.setOnErrorListener(this);
        player.setOnPreparedListener(this);
        player.prepareAsync();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }       
}
@Override
public void onDestroy() {
    super.onDestroy();
    player.release();
    player = null;
}
@Override
public void onPrepared(MediaPlayer play) {
    play.start();
}
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
    return false;
}
}
3
Emran Hamza

Ich bin vor einigen Tagen auf dieselbe Ausgabe gestoßen. Mein Audio-MediaPlayer funktioniert einwandfrei auf Geräten mit hoher Prozessorleistung. Bei langsamen Geräten wurde der Media-Player jedoch einige Zeit nicht abgespielt, und von LogCat mussten sich viele beschweren, dass er sich in einem falschen Zustand befand. Also löste ich es durch Aufruf des Aufrufs an start () , pause () , ... in onPrepared () Methode von OnPreparedListener () wie folgt:

mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    ........
                    mediaPlayer.start();
                    ....
                    songControlBtn.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (mediaPlayer.isPlaying()) {
                                mediaPlayer.pause();

                            } else {
                                mediaPlayer.start();

                            }
                        }
                    });

                    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            ............

                        }
                    });
                }
            });

Versuchen Sie auch, einen Media-Player freizugeben, den Sie nicht mehr benötigen. Wenn Sie beispielsweise Audio oder Video nicht im Hintergrund abspielen möchten, rufen Sie mediaPlayer.release () in onPause () auf.

3
Tony Vu

Manchmal werden Dateien so codiert, dass Android sie nicht decodieren kann. Sogar einige mp4-Dateien können nicht abgespielt werden. Bitte probieren Sie ein anderes Dateiformat (.3gp werden meistens gespielt) und sehen Sie ..

3
Rukmal Dias

Ich habe sowohl die Fehler (-19,0) als auch (-38,0) behoben, indem ich vor dem Abspielen jedes Mal ein neues Objekt von MediaPlayer erstellt und es danach freigegeben habe.

Vor :

void play(int resourceID) {
if (getActivity() != null) {

     //Using the same object - Problem persists
    player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            player.release();
        }
    });

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

}

}

Nach dem:

void play(int resourceID) {

if (getActivity() != null) {

    //Problem Solved
    //Creating new MediaPlayer object every time and releasing it after completion
    final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            player.release();
        }
    });

    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

}

}

1

enter image description here

über dem Bild können Sie den richtigen Weg finden.

0
Longalei
  if(length>0)
        {
            mediaPlayer = new MediaPlayer();
            Log.d("length",""+length);
            try {
                mediaPlayer.setDataSource(getApplication(),Uri.parse(uri));
            } catch(IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mediaPlayer.seekTo(length);
                    mediaPlayer.start();

                }
            });
            mediaPlayer.prepareAsync();
0
kamakshi

Ich habe auch diese Fehlermeldung erhalten, die ich mit onPreparedListener ausprobiert habe, aber immer noch diese Fehlermeldung erhalten. Schließlich bekam ich die Lösung, dass Fehler mein Fehler ist, weil ich die Internet-Erlaubnis in Android Manifest xml vergessen habe. :)

<uses-permission Android:name="Android.permission.INTERNET" />

Ich habe die Codierung für den Mediaplayer verwendet. Ich habe in StreamService.Java verwendet 
onCreate-Methode

        String url = "http://s17.myradiostream.com:11474/";
        mediaPlayer = new MediaPlayer();            
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepare();
0
B M

Es war alles sehr frustriert. Also bekam ich eine Lösung, die für mich funktioniert. 

try {
                        if (mediaPlayer != null) {
                            mediaPlayer.release();
                            mediaPlayer = null;

                        }
                        mediaPlayer = new MediaPlayer();
                        mediaPlayer.setDataSource(file.getAbsolutePath());
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mediaPlayer) {
                                mediaPlayer.start();
                                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                                    @Override
                                    public void onCompletion(MediaPlayer mediaPlayer) {
                                        mediaPlayer.stop();
                                        mediaPlayer.release();
                                        mediaPlayer = null;
                                    }
                                });
                            }
                        });
                        mediaPlayer.prepare();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
0
Aman Srii

Für mich hat das funktioniert

mp.seekTo(0);
mp.start();
0
Piyush Jajoo

Sie erhalten diese Nachricht in den Protokollen, weil Sie etwas tun, das im aktuellen Status Ihrer MediaPlayer-Instanz nicht zulässig ist.

Daher sollten Sie immer einen Fehlerbehandler registrieren, um diese Dinge zu erfassen (wie @tidbeck vorgeschlagen hat).

Zuerst empfehle ich Ihnen, sich die Dokumentation der Klasse MediaPlayer anzusehen und zu verstehen, was das mit Zuständen bedeutet. Siehe: http://developer.Android.com/reference/Android/media/MediaPlayer.html#StateDiagram

Ihr Fehler hier könnte durchaus einer der häufigsten sein, die anderen haben hier geschrieben, aber im Allgemeinen würde ich mir die Dokumentation ansehen, welche Methoden in welchem ​​Zustand gültig sind: http://developer.Android. de/reference/Android/media/MediaPlayer.html # Valid_and_Invalid_States

In meinem Beispiel war es die Methode mediaPlayer.CurrentPosition, die ich angerufen habe, während sich der Media Player in einem Zustand befand, in dem er diese Eigenschaft nicht aufrufen durfte.

0
SimonSimCity