2013-08-28 10 views
9

私は簡単なオンラインラジオプレーヤーをしようとします。ここにストリームのアドレスがありますhttp://radio-electron.ru:8000/96ここに私のコードです。mediaPlayerエラー-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.hからENOSYSエラーコードを参照(この説明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()は同期して動作します。だから、プレイヤーは必ずstart()の前に準備するべきです。いくつかのファイルでのみ起こります。 – ka3ak

+0

@ ka3ak面白いです。あなたがそれを質問として投稿し、それを再現する方法を提供することができれば、私はあなたを助けることができる人がいると確信しています。 – allprog

+1

私はすでにそれの原因を見つけました。ファイルパスには#が含まれていましたが、URLを使用してデータソースを設定しました。私は、不完全な準備だけでなく、エラーが発生する可能性があることを指摘したかっただけです。 – ka3ak

2

エラーコード-38は、INVALID_OPERATIONに対応する必要があります。

これはおそらく、prepareAsyncが完了してからstartに電話するのを待つことがないためです。 onPreparedが呼び出された場合にのみ、onPreparedListenerを設定してMediaPlayerを開始する必要があります。

2

@allprogと@Michaelが正しいです。しかし、別の方法があります。prepareAsync()を使用したくない場合は、prepare()を使用します。これはブロッキングで、準備されているときにのみ返されます。

+3

UIスレッドでそれをしないでください。 – Michael

4

私は-38エラーを受け取りました。getDuration();をMediaPlayer に呼び出し、を準備しました。


MediaPlayer文書をチェックする価値があります。

はMediaPlayerのが準備される前に、順番に-38につながる可能性がある、呼び出すために非理想的な方法のリストを持っているIt is a programming error to invoke methods such as getCurrentPosition()...

を開始段落があります。

+1

あなたは私の夜を救う!ありがとう。 – SteeBono

+1

それは私に起こっていた! 'prepare()'と 'start()'はともにOKを呼び出します!残念ながら、メインスレッドは間違った瞬間にgetCurrentPosition()とgetDuration()を呼び出していました。私はラッパークラスを作成して修正しました:https://github.com/carlosrafaelgn/FPlayAndroid/blob/master/src-traditional/br/com/carlosrafaelgn/fplay/playback/context/MediaPlayerWrapper.java – carlosrafaelgn

3

再生状態のような操作を実行している場合は、Mediaplayerを起動する前にgetCurrentPosition()のようにしてください。

+0

クール私にとっては: 'onPrepared()'リスナーが呼び出される前に 'mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);を呼び出しました。 – soshial

関連する問題