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.
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();
}
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);
}
});
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.
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);
}
}
});
}
}
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;
}
}
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.
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 ..
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();
}
});
}
}
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();
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();
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();
}
Für mich hat das funktioniert
mp.seekTo(0);
mp.start();
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.