I try to do simple online radio player. Here is adress of stream http://radio-electron.ru:8000/96 Here is my 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>
I have no idea, why i get -(38, 0) code and what does it mean. I using Intellij IDEA and trying this code on Android 2.3 and 4.2 emulators and get some problem.
-38 refers to ENOSYS
error code from errno.h (see this explanation https://stackoverflow.com/a/15206308/768935)
You seem to try to start the playing before the preparation is complete. Use the setOnPreparedListener()
method to set a preparation listener and call the start()
method only after the preparation is complete.
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
And remove the current mediaPlayer.start()
invocation from the code.
I was getting my -38
error by calling getDuration();
on the MediaPlayer before it was prepared.
It's worth checking the MediaPlayer doc.
There is a paragraph that starts It is a programming error to invoke methods such as getCurrentPosition()...
that has a list of methods which are un-ideal to call before the MediaPlayer is prepared, which in turn may result in -38
.
You better check if you are executing any operation that is related to the playing state like getCurrentPosition()
before the Mediaplayer is started.
The error code -38 ought to correspond to INVALID_OPERATION
.
A likely cause of this is that you don't wait for prepareAsync
to finish before you call start
. You should set an onPreparedListener and start the MediaPlayer
only when onPrepared
has been called.
@allprog and @Michael are right. But there is another way, if you don't want to use prepareAsync(), use prepare(). That is blocking, which is returned only when it is prepared.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With