mecool - mediaplayer create android example
Media Player llamado en estado 0, error(-38,0) (15)
Algunas veces, los archivos están codificados de una manera que Android no puede decodificar. Incluso algunos archivos mp4 no se pueden reproducir. Pruebe con un formato de archivo diferente (.3gp se juega la mayor parte del tiempo) y vea ...
Actualmente estoy tratando de diseñar una aplicación simple que transmita una estación de radio por Internet. Tengo la URL de la estación y estoy configurando el reproductor multimedia como
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();
El programa no se bloquea cuando se emula, pero no se reproduce nada y recibo el siguiente error:
start called in state 0
y justo debajo es
Error (-38,0)
Alguien sabe que significa esto?
He leído un poco sobre estos errores de estado, pero no pude encontrar nada que se aplique a mi proyecto.
Estaba muy frustrado. Entonces, obtuve una solución que funciona para mí.
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();
}
Me encontré con el mismo problema hace unos días. Mi MediaPlayer de audio funciona bien en dispositivos con alta potencia de procesamiento, pero para dispositivos lentos, el reproductor de medios simplemente no jugó un poco de tiempo y desde LogCat tuvo muchas quejas sobre llamadas en estado incorrecto. Así que lo resolví llamando al poner la llamada en start () , pause () , ... en el método onPrepared () de OnPreparedListener () como se muestra a continuación:
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) {
............
}
});
}
});
También intente liberar cualquier reproductor multimedia que ya no necesite. Por ejemplo, si no desea reproducir el audio o video en segundo plano, debe llamar a mediaPlayer.release () en onPause () .
Me encontré con el mismo problema justo antes, el amigo en el primer piso tenía razón, llamó al start()
en el momento equivocado, debe establecer un oyente para prepare () o prepareSync()
con este método mediaPlayer.setOnPreparedListener(this)
; antes de preparar, en esta devolución de llamada, start()
. Puede resolver su problema. Ya lo he intentado.
Obtiene este mensaje en los registros, porque hace algo que no está permitido en el estado actual de su instancia de MediaPlayer.
Por lo tanto, siempre debe registrar un controlador de errores para detectar esas cosas (como se sugirió @tidbeck).
Al principio, te aconsejo que eches un vistazo a la documentación de la clase MediaPlayer
y entiendas qué significa eso con states. Ver: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram
Su error aquí podría ser uno de los más comunes, los demás escribieron aquí, pero, en general, me gustaría echar un vistazo a la documentación de los métodos válidos para llamar en qué estado: http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States
En mi ejemplo, era el método mediaPlayer.CurrentPosition
, al que llamé mientras el reproductor multimedia estaba en un estado en el que no se permitía llamar a esta propiedad.
Obtuve este error cuando estaba tratando de obtener la posición actual (MediaPlayer.getCurrentPosition ()) del reproductor multimedia cuando no estaba en el estado preparado. Lo solucioné haciendo un seguimiento de su estado y llamando solo al método getCurrentPosition () después de llamar a onPreparedListener.
Para mí esto funcionó
mp.seekTo(0);
mp.start();
Parece que el error -38 significa una excepción de estado (como indica el mensaje de error). Por ejemplo, si llama a start()
, antes de que la canción estuviera lista, o cuando llama a pause()
, incluso si la canción no se está reproduciendo en absoluto.
Para solucionar este problema, verifique el estado del mediaPlayer antes de llamar a los métodos. Por ejemplo:
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
Además, MediaPlayer está enviando mensajes de evento. Incluso si no necesita el evento preparado (aunque sería una buena idea no iniciar la reproducción antes de que se desencadene este evento) debe configurar un callback-listener. Esto también es válido para OnErrorListener
, OnCompletionListener
, OnPreparedListener
y OnSeekCompletedListener
(si llama al método de búsqueda).
Los oyentes se pueden conectar simplemente por
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// Do something. For example: playButton.setEnabled(true);
}
});
Probé a continuación el código. funcionando bien
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;
}
}
Resolví ambos errores (-19,0) y (-38,0), creando un nuevo objeto de MediaPlayer cada vez antes de jugar y soltándolo después de eso.
Antes de :
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();
}
});
}
}
Después:
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();
}
});
}
}
También recibí este error, lo intenté con onPreparedListener pero aún así obtuve este error. Finalmente recibí la solución de que el error es mi culpa porque olvidé el permiso de Internet en Android Manifest xml. :)
<uses-permission android:name="android.permission.INTERNET" />
Usé la codificación de muestra para el reproductor multimedia. Utilicé en StreamService.java
método onCreate
String url = "http://s17.myradiostream.com:11474/";
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
mediaPlayer.start()
llamar a mediaPlayer.start()
en el método onPrepared
utilizando un oyente. mediaPlayer.start()
este error porque está llamando a mediaPlayer.start()
antes de que haya alcanzado el estado preparado.
Aquí sabrás como podrás hacerlo :
mp.setDataSource(url);
mp.setOnPreparedListener(this);
mp.prepareAsync();
public void onPrepared(MediaPlayer player) {
player.start();
}
Este es mi código, probado y funcionando bien:
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);
}
}
});
}
}
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();
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();