媒体播放器错误-38,0

11

我试图做一个简单的在线广播播放器。这是流媒体的地址:http://radio-electron.ru:8000/96 这是我的代码。

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

主要.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>

我不知道为什么会出现-(38, 0)的代码,也不知道它是什么意思。我正在使用Intellij IDEA,在Android 2.3和4.2模拟器上尝试运行这段代码,但遇到了一些问题。

5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
20

-38 是指来自 errno.hENOSYS 错误代码(请参阅此说明https://stackoverflow.com/a/15206308/768935

看起来您似乎在准备完成之前就尝试启动播放。使用 setOnPreparedListener() 方法设置准备监听器,并在准备完成后调用 start() 方法。

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
  public void onPrepared(MediaPlayer mp) {
      mp.start();
  }
});
mediaPlayer.prepareAsync();

请从代码中移除当前的mediaPlayer.start()调用。


即使在start()之前使用prepare()方法,我仍然会收到相同的错误。而且prepare()是同步工作的。因此,在开始之前,播放器一定要准备好。这只会发生在某些文件中。 - ka3ak
@ka3ak 很有趣。如果您能将其发布为一个问题并提供一种重现的方法,我相信会有人可以帮助您。 - allprog
1
我已经找到了原因。文件路径包含 #,但我使用 URL 来设置数据源。我只是想指出错误不仅可能是由于准备不完整引起的。 - ka3ak

7

在MediaPlayer准备好之前,通过调用getDuration();导致我遇到了-38错误。


值得检查MediaPlayer文档。

有一个段落以调用getCurrentPosition()等方法是编程错误...开头。

该段落列出了在MediaPlayer准备之前不宜调用的方法,这可能导致-38错误。


1
你救了我的夜晚!谢谢。 - stfno.me
1
那正是我遇到的问题!调用 prepare()start() 都没有问题!不幸的是,主线程在错误的时刻调用了 getCurrentPosition()getDuration()。我通过创建一个包装类来解决这个问题:https://github.com/carlosrafaelgn/FPlayAndroid/blob/master/src-traditional/br/com/carlosrafaelgn/fplay/playback/context/MediaPlayerWrapper.java - carlosrafaelgn

3

在启动Mediaplayer之前,最好检查是否执行了与“播放状态”相关的任何操作,例如getCurrentPosition()


很酷,这也是我的情况:在调用onPrepared()监听器之前,我调用了mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT); - soshial

2
错误代码-38应该对应于INVALID_OPERATION。 这种情况的可能原因是在调用start之前没有等待prepareAsync完成。您应该设置一个onPreparedListener,并且只有在调用onPrepared后才启动MediaPlayer

2
@allprog和@Michael是正确的。 但是,如果您不想使用prepareAsync(),还有另一种方法可以使用prepare()。 这是阻塞的,只有在准备好时才返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,