2012-01-25 15 views
76

Attualmente sto cercando di progettare una semplice app che trasmette in streaming una stazione radio internet. Ho l'URL per la stazione e sono la creazione di Media Player comeMedia Player chiamato nello stato 0, errore (-38,0)

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

Il programma non si blocca quando emulato, ma nulla sta giocando e sono ottenere il seguente errore:

start called in state 0 

e in basso a destra è

Error (-38,0) 

qualcuno sa cosa significa questo?

Ho letto un po 'di questi errori di stato, ma non ho trovato nulla che si applichi al mio progetto.

+1

http://stackoverflow.com/questions/8681550/android-2-2-mediaplayer-is-working-fine-with-one-shoutcast-url -ma-non-con-la http://stackoverflow.com/questions/8671479/android-mediaplayer-works-fine-in-our-custom-audio-streaming-application-up-to-a –

+0

possibile duplicato di [Problemi di Android MediaPlayer: "Errore (-38, 0)" e "stop chiamato nello stato 1"] (http://stackoverflow.com/questions/11913108/android-mediaplayer-problems-error-38-0-and -stop-called-in-state-1) – rds

+0

@SmashCode contrassegna un'altra risposta come accettata in quanto la mia risposta è completamente inutile. – tidbeck

risposta

89

È necessario chiamare mediaPlayer.start() nel metodo onPrepared utilizzando un listener. Si sta verificando questo errore perché si sta chiamando mediaPlayer.start() prima che abbia raggiunto lo stato preparato.

Ecco come si può fare:

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

public void onPrepared(MediaPlayer player) { 
    player.start(); 
} 
+12

Questa soluzione funziona solo sostituire mp.start(); con player.start(); –

+1

Grazie! Questa dovrebbe essere la risposta corretta. – asgs

+0

E se non vogliamo che inizi subito? Anche se inizializzo il mio lettore e aspetto circa un minuto, la prima volta che provo a riprodurlo, ha questo errore a meno che non chiami .start() in onPrepared – Elliptica

2

Alcune volte i file sono codificati in un modo che Android non può decodificare. Anche alcuni file mp4 non possono essere riprodotti. Si prega di provare un diverso formato di file (.3gp vengono riprodotti la maggior parte del tempo) e vedere ..

+37

Non posso chiedere a una stazione radio internet di cambiare il loro formato di file. – SmashCode

+0

Ricevi il popup "Impossibile riprodurre questo video"? Come lo gestisci? Prendo l'errore ma ottengo questa modal indipendentemente e non ho alcun controllo sulla fonte dei media come proviene da un'API pubblica. Se qualcuno sa come impedire che il modal "Can not play this video" sia grato. – Krafty

+0

Hai provato a impostare un listener di errori. MediaPlayer mp = new MediaPlayer() { @Override pubblico setOnErrorListener void (android.media.MediaPlayer.OnErrorListener ascoltatore) {// fare cose qui .. }} ; mp.setDataSource (.. –

24

Sembra errore -38: uno Stato-eccezione (come l'errore-messaggio indica). Ad esempio, se chiami start(), prima che la canzone fosse pronta o quando chiami pause(), anche se la canzone non viene riprodotta affatto.

Per risolvere questo problema, controllare lo stato di mediaPlayer prima di chiamare i metodi. Ad esempio:

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

Inoltre, MediaPlayer invia messaggi di evento. Anche se non hai bisogno dell'evento preparato (anche se sarebbe una buona idea non avviare la riproduzione prima che questo evento venisse attivato) devi impostare un callback-listener. Ciò vale anche per lo OnErrorListener, OnCompletionListener, OnPreparedListener e OnSeekCompletedListener (se si chiama il metodo di ricerca).

ascoltatori possono essere attaccati semplicemente

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

calling pause() su non player player era il mio caso –

+0

calling mediaPlayer .isPlaying() in uno stato invalido invierà il lettore multimediale in uno stato di errore.Meglio mantenere un enum esplicito per mantenere gli stati. – Madeyedexter

2

ho provato qui sotto code. lavorando bene

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; 
} 
} 
6

Questo è il mio codice, testata e funziona bene:

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); 
     } 
     } 
    }); 
    } 
} 
+1

Grazie, questo è stato davvero utile anche a me! – Valdrinit

-1

Ho incontrato lo stesso problema poco prima, l'amico al primo piano aveva ragione, è chiamata la start() a nel momento sbagliato, è necessario impostare un listener per prepare() o prepareSync() con questo metodo mediaPlayer.setOnPreparedListener(this); prima di prepararti, in questa chiamata di richiamata start(). Può risolvere il tuo problema. Ho già provato.

+0

Potresti essere più specifico? –

+0

Siamo spiacenti, inglese non è la mia prima lingua, e anche io non sono bravo ... ma voglio solo aiutare gli altri che hanno le stesse domande ,È tutto. – peerless2012

2

Ho riscontrato lo stesso problema pochi giorni fa.Il mio audio MediaPlayer funziona bene su dispositivi con elevata potenza di elaborazione, ma per i dispositivi lenti, il lettore multimediale non ha giocato un po 'di tempo e da LogCat si è lamentato di aver chiamato in uno stato sbagliato. Così ho risolto chiamando mettendo la chiamata a start(), pausa(), ... in onPrepared() metodo OnPreparedListener() come di seguito:

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) { 
          ............ 

         } 
        }); 
       } 
      }); 

provare anche per rilasciare qualsiasi lettore multimediale che non ti serva più. Ad esempio, se non si desidera riprodurre l'audio o il video sullo sfondo, è necessario chiamare mediaPlayer.release() in onPause().

0

Si ottiene questo messaggio nei registri, perché si esegue qualcosa che non è consentito nello stato corrente dell'istanza di MediaPlayer.

Pertanto è necessario registrare sempre un gestore errori per rilevare tali elementi (come suggerito da @tidbeck).

In un primo momento, consiglio di dare un'occhiata alla documentazione della classe MediaPlayer e di capire cosa significa con gli stati. Vedere: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

tuo errore qui potrebbe benissimo essere uno di quelli comuni, gli altri hanno scritto qui, ma in generale, vorrei dare un'occhiata alla documentazione dei quali metodi sono validi per chiamare in quale stato: http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States

Nel mio esempio è stato il metodo mediaPlayer.CurrentPosition, che ho chiamato mentre il lettore multimediale era in uno stato, in cui non era consentito chiamare questa proprietà.

-1
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(); 
6

ho ottenuto questo errore quando stavo cercando di ottenere la posizione corrente (MediaPlayer.getCurrentPosition()) di media player quando non era nel preparato indicato. Ho aggirato questo tenendo traccia del suo stato e chiamando solo il metodo getCurrentPosition() dopo che onPreparedListener è stato chiamato.

+1

Grazie mille mi hai risparmiato ore di indovinare –

+0

Come hai capito che era per quel motivo? – AdamMc331

0

Ho anche ricevuto questo errore che ho provato con onPreparedListener ma ho ancora ricevuto questo errore. Finalmente ho trovato la soluzione che l'errore è colpa mia perché ho dimenticato il permesso di internet in Android Manifest xml. :)

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

ho usato codifica campione per mediaplayer. Ho usato in StreamService.java
metodo onCreate

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

ho risolto sia degli errori (-19,0) e (-38,0), creando un nuovo oggetto di MediaPlayer ogni volta prima di giocare e rilasciandolo dopo.

Prima:

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

} 

}

Dopo:

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

} 

}

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

Si prega di aggiungere qualche spiegazione al codice pure? –

0

E 'stato ogni tanto frustrato. Quindi, ho una soluzione che funziona per me.

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

Per me questo ha funzionato

mp.seekTo(0); 
mp.start(); 
Problemi correlati