mediaPlayer erreur -38,0
J'essaie de faire simple radio en ligne joueur. Voici l'adresse du flux http://radio-electron.ru:8000/96 Voici mon code.
MyActivity.java
package com.example.untitled2;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
public class MyActivity extends Activity {
MediaPlayer mediaPlayer;
Button playButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onResume() {
super.onResume();
mediaPlayer = new MediaPlayer();
playButton = (Button)findViewById(R.id.button);
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mediaPlayer.isPlaying())
mediaPlayer.stop();
else {
try {
mediaPlayer.setDataSource(getApplicationContext(), Uri.parse("http://radio-electron.ru:8000/96"));
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i2) {
Toast.makeText(getApplicationContext(), "ERROR " + i, Toast.LENGTH_LONG).show();
playButton.setEnabled(false);
Log.d("radio", "error " + i + " " + i2);
return false; //To change body of implemented methods use File | Settings | File Templates.
}
});
mediaPlayer.prepareAsync();
}
catch (IOException e) {
Toast.makeText(getApplicationContext(), "ERROR " + e, Toast.LENGTH_LONG).show();
Log.d("radio", "error " + e);
}
mediaPlayer.start();
}
}
});
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_gravity="center"/>
</FrameLayout>
Je n'ai aucune idée, pourquoi je m' -(38, 0) du code et ce que cela signifie.
Je l'aide Intellij IDEA et d'essayer ce code sur Android 2.3 et 4.2 des émulateurs et obtenir de problème.
OriginalL'auteur Coma White | 2013-08-28
Vous devez vous connecter pour publier un commentaire.
-38 se réfère à
ENOSYS
code d'erreur de errno.h (voir cette explication https://stackoverflow.com/a/15206308/768935)Vous semblez vous essayez de démarrer le jeu avant la préparation est terminée. Utiliser le
setOnPreparedListener()
méthode pour définir une préparation auditeur et d'appeler lastart()
méthode après la préparation est terminée.Et retirez le
mediaPlayer.start()
invocation à partir du code.intéressant. Si vous pouvez poster une question et de fournir un moyen de le reproduire, je suis sûr qu'il y aura quelqu'un qui peut vous aider.
J'ai déjà trouvé la cause. Le chemin d'accès au fichier contenues #, mais j'ai utilisé l'URL pour définir la source de données. Je voulais juste faire remarquer que l'erreur peut être causée non seulement par incomplète de la préparation.
OriginalL'auteur allprog
J'ai été faire mon
-38
erreur en appelantgetDuration();
sur le MediaPlayer avant il a été préparé.Il vaut la peine de regarder le MediaPlayer doc.
Il y a un paragraphe qui commence
It is a programming error to invoke methods such as getCurrentPosition()...
qui a une liste de méthodes qui sont non-idéal à l'appel avant que le lecteur multimédia est préparé, qui à son tour peut entraîner
-38
.Qu'est-ce qui m'arrive! Les deux
prepare()
etstart()
appels où OK! Malheureusement, le thread principal est d'appeler getCurrentPosition() et getDuration() au mauvais moment. J'ai corrigé par la création d'une classe wrapper: github.com/carlosrafaelgn/FPlayAndroid/blob/master/...OriginalL'auteur Unknownweirdo
Vous mieux de vérifier si vous êtes l'exécution de toute opération qui est liée à la état de lecture comme
getCurrentPosition()
avant le Mediaplayer est commencé.mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);
avantonPrepared()
auditeur a été appelé.OriginalL'auteur pilotmario
Le code d'erreur -38 devraient correspondre à
INVALID_OPERATION
.Une cause probable de cette est que vous n'avez pas à attendre pour
prepareAsync
finir avant de vous appelerstart
. Vous devez définir un onPreparedListener et démarrer leMediaPlayer
uniquement lorsqueonPrepared
a été appelé.OriginalL'auteur Michael
@allprog et @Michael sont à droite. Mais il est une autre façon, si vous ne voulez pas utiliser prepareAsync(), utilisez prepare(). C'est le blocage, qui est retourné seulement lorsqu'il est préparé.
OriginalL'auteur g-hos