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

105

Ich versuche gerade, eine einfache App zu entwerfen, die einen Internetradiosender streamt. Ich habe die URL für den Sender und richte den Media Player wie 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 beim Emulieren nicht ab, aber es wird nichts abgespielt und ich erhalte die folgende Fehlermeldung:

start called in state 0

und direkt darunter ist es

Error (-38,0)

Weiß jemand was das bedeutet?

Ich habe ein wenig über diese Statusfehler gelesen, konnte aber nichts finden, was für mein Projekt gilt.

SmashCode
quelle
@SmashCode Bitte markieren Sie eine andere Antwort als akzeptiert, da meine Antwort völlig nutzlos ist.
Tidbeck

Antworten:

119

Sie müssen mediaPlayer.start()die onPreparedMethode mithilfe eines Listeners aufrufen . Sie erhalten diesen Fehler, weil Sie anrufen, mediaPlayer.start()bevor der vorbereitete Status erreicht ist.

So können Sie es machen:

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

public void onPrepared(MediaPlayer player) {
    player.start();
}
user1492955
quelle
Was ist, wenn wir nicht wollen, dass es sofort beginnt? Selbst wenn ich meinen Player initialisiere und ungefähr eine Minute warte, tritt beim ersten Versuch, ihn abzuspielen, dieser Fehler auf, es sei denn, ich rufe .start () in onPrepared
Elliptica
1
Sie bereiten es vorher vor und erinnern sich, dass Sie es vorbereitet haben. Parallel dazu versuchen Sie sich zu erinnern, ob Sie es ausführen möchten. Wenn es vorbereitet ist und Sie es ausführen möchten, starten Sie es.
Victor Paléologue
33

Es scheint, als ob Fehler -38 eine Statusausnahme bedeutet (wie die Fehlermeldung anzeigt). Zum Beispiel, wenn Sie anrufen start(), bevor das Lied fertig war, oder wenn Sie anrufen pause(), auch wenn das Lied überhaupt nicht abgespielt wird.

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

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

Zusätzlich sendet der MediaPlayer Ereignismeldungen. Auch 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 Rückruf-Listener festlegen. Dies gilt auch für die OnErrorListener, OnCompletionListener, OnPreparedListenerund OnSeekCompletedListener(wenn Sie die Suchmethode aufrufen).

Zuhörer können einfach von angehängt werden

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // Do something. For example: playButton.setEnabled(true);
    }
});
Alexander Pacha
quelle
pause ()
aufzurufen,
Wenn Sie mediaPlayer.isPlaying () in einem ungültigen Zustand aufrufen, wird der Media Player in einen Fehlerzustand versetzt. Besser eine explizite Aufzählung zur Aufrechterhaltung von Zuständen.
Madeyedexter
14

Ich habe diesen Fehler erhalten, als ich versucht habe, die aktuelle Position (MediaPlayer.getCurrentPosition ()) des Media Players abzurufen, wenn diese nicht in der angegebenen Position enthalten war. Ich habe dies umgangen, indem ich den Status verfolgt und die Methode getCurrentPosition () erst aufgerufen habe, nachdem onPreparedListener aufgerufen wurde.

Feuer im Loch
quelle
Wie haben Sie herausgefunden, dass es aus diesem Grund war?
AdamMc331
9

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);
        }
      }
    });
  }
}
MAK
quelle
4

Ich habe unten 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;
}
}
Emran Hamza
quelle
Für und Update zu SetAudioStreamType(..)verwendenSetAudioAttributes(...)
Pierre
4

Ich bin vor einigen Tagen auf dasselbe Problem gestoßen. Mein Audio-MediaPlayer funktioniert einwandfrei auf Geräten mit hoher Verarbeitungsleistung, aber bei langsamen Geräten hat der Mediaplayer einige Zeit nicht abgespielt, und von LogCat haben sich viele darüber beschwert, dass er im falschen Zustand angerufen wurde. Also habe ich es gelöst, indem ich den Aufruf von start () , pause () , ... in der onPrepared () -Methode von OnPreparedListener () wie folgt aufgerufen habe :

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. Zum Beispiel, wenn Sie die Audio- oder Video - on - Hintergrund nicht spielen wollen , dann sollten Sie rufen mediaPlayer.release () in onPause () .

Tony Vu
quelle
3

Manchmal werden Dateien so codiert, dass Android sie nicht dekodieren kann. Auch einige mp4-Dateien können nicht abgespielt werden. Bitte versuchen Sie es mit einem anderen Dateiformat (.3gp werden die meiste Zeit abgespielt) und sehen Sie ..

Rukmal Dias
quelle
46
Ich kann einen Internetradiosender nicht bitten, sein Dateiformat zu ändern.
SmashCode
Erhalten Sie das Popup "Kann dieses Video nicht abspielen"? Wie gehst du damit um? Ich erkenne den Fehler, erhalte dieses Modal jedoch trotzdem und habe keine Kontrolle über die Medienquelle, da diese von einer öffentlichen API stammt. Wenn jemand weiß, wie man das Modal "Kann dieses Video nicht abspielen" verhindern kann, wäre ich dankbar.
Krafty
Haben Sie versucht, einen Fehler-Listener einzustellen? MediaPlayer mp = new MediaPlayer () {@Override public void setOnErrorListener (android.media.MediaPlayer.OnErrorListener Listener) {// Mach hier was ..}}; mp.setDataSource (..
Rukmal Dias
1

Geben Sie hier die Bildbeschreibung ein

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

Longalei
quelle
0

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 abzufangen (wie von @tidbeck vorgeschlagen).

Zunächst rate ich Ihnen, sich die Dokumentation für die MediaPlayerKlasse anzusehen und zu verstehen, was dies 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 hier geschrieben haben, aber im Allgemeinen würde ich mir die Dokumentation ansehen, welche Methoden in welchem ​​Zustand zum Aufrufen gültig sind: http://developer.android.com/ Referenz / android / media / MediaPlayer.html # Valid_and_Invalid_States

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

SimonSimCity
quelle
0

Ich habe sowohl die Fehler (-19,0) als auch (-38,0) behoben, indem ich jedes Mal ein neues Objekt von MediaPlayer erstellt habe, bevor ich es abgespielt und danach wieder 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();
        }
    });

}

}}

Saurabh Padwekar
quelle
0
  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();
Kamakshi
quelle
0

Es war sehr frustriert. Also habe ich eine Lösung bekommen, 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();
                    }
Aman Srii
quelle
0

Bei mir hat das geklappt

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

Ich habe auch diesen Fehler bekommen, den ich mit onPreparedListener versucht habe, aber immer noch diesen Fehler. Endlich habe ich die Lösung gefunden, dass der Fehler meine Schuld ist, weil ich die Internetberechtigung in Android Manifest xml vergessen habe. :) :)

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

Ich habe Beispielcodierung für Mediaplayer verwendet. Ich habe in der StreamService.java-
onCreateMethode verwendet

String url = "http://s17.myradiostream.com:11474/";
mediaPlayer = new MediaPlayer();            
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
BM
quelle
-1

Ich habe das gleiche Problem kurz zuvor getroffen, der Freund im ersten Stock hatte Recht, Sie haben den start()zur falschen Zeit angerufen , Sie sollten einen Listener für prepare () oder prepareSync()mit dieser Methode einstellen mediaPlayer.setOnPreparedListener(this); vor der Vorbereitung in diesem Rückruf. start()Es kann Ihr Problem lösen. Ich habe es schon versucht.

peerless2012
quelle
Könnten Sie genauer sein?
Karthik AMR
Entschuldigung, Englisch ist nicht meine Muttersprache und ich bin auch nicht gut darin ... aber ich möchte nur anderen helfen, die die gleichen Fragen haben, das ist alles.
Peerless2012
-1

Ich bin neu in der Android-Programmierung und hatte den gleichen Fehler wie dieser. Also habe ich einfach den mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI) neu definiert. Es ist vielleicht nicht der wahre Weg, es zu tun, aber es hat für mich mit einer Geldstrafe geahndet:

try {
  mp = MediaPlayer.create(getApplicationContext(), Settings.System.DEFAULT_RINGTONE_URI);
} catch (Exception e) {
  e.printStackTrace();
}

mp.start();
Monsun Khadka
quelle
-2
mp = new MediaPlayer();
AssetFileDescriptor afd = mContext.getAssets().openFd(fileName);
mp.reset();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  public void onPrepared(MediaPlayer mp) {
    mp.start();
  }
});

mp.prepareAsync();
HuynhHan
quelle