2013-08-28 33 views
9

我嘗試做簡單的在線廣播播放器。這裏是流的地址http://radio-electron.ru:8000/96這是我的代碼。mediaPlayer error -38,0

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> 

我不知道,爲什麼我得到 - (38,0)碼是什麼意思。 我使用Intellij IDEA並在Android 2.3和4.2模擬器上試用此代碼,並得到一些問題。

回答

17

-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()調用。

+0

即使在start()之前使用prepare()方法,我也會得到相同的錯誤。和prepare()同步工作。所以玩家一定要在開始之前做好準備()。它只發生在一些文件中。 – ka3ak

+0

@ ka3ak有趣。如果您可以將其作爲問題發佈並提供重現方式,我相信會有人能夠幫助您。 – allprog

+1

我已經找到它的原因。文件路徑包含#,但我使用URL來設置數據源。我只想指出,錯誤不僅可能是由不完備的準備造成的。 – ka3ak

2

錯誤代碼-38應該對應於INVALID_OPERATION

可能的原因是您在致電start之前不要等到prepareAsync完成。只有當調用onPrepared時,才應設置onPreparedListener並啓動MediaPlayer

2

@allprog和@Michael是對的。但還有另一種方法,如果你不想使用prepareAsync(),使用prepare()。這是阻止,僅在準備好時纔會返回。

+3

只是不要在UI線程上做到這一點。 – Michael

4

在準備好之前,我在MediaPlayer 上調用getDuration();來得到我的-38錯誤。


這是值得檢查MediaPlayer文檔。

有啓動It is a programming error to invoke methods such as getCurrentPosition()...

擁有的這是聯合國的理想準備在MediaPlayer之前調用,這反過來又可能導致-38方法列表一個段落。

+1

你拯救了我的夜晚!謝謝。 – SteeBono

+1

這發生在我身上!在準備好()'和'start()'調用的地方都可以!不幸的是,主線程在錯誤的時刻調用了getCurrentPosition()和getDuration()。我通過創建一個包裝類來解決:https://github.com/carlosrafaelgn/FPlayAndroid/blob/master/src-traditional/br/com/carlosrafaelgn/fplay/playback/context/MediaPlayerWrapper.java – carlosrafaelgn

3

在Mediaplayer啓動之前,您最好檢查是否正在執行與播放狀態(如getCurrentPosition())相關的任何操作。

+0

很酷,這是這種情況對於我:我調用'mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);'在'onPrepared()'偵聽器被調用之前。 – soshial

相關問題