2016-09-30 4 views
0

こんにちは、私はオンラインラジオストリーミングアプリを構築しています。再生ボタンを押しているときにjava.lang.IllegalStateExceptionエラーが発生します。主な活動は次のようになります。メディアプレーヤーのjava.lang.IllegalStateException

package com.radioawaz.simerpreetjassal.radioawaz; 

import android.app.Activity; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnBufferingUpdateListener; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ProgressBar; 

import java.io.IOException; 

public class MainActivity extends Activity implements OnClickListener { 

    private ProgressBar playSeekBar; 

    private Button buttonPlay; 

    private Button buttonStopPlay; 

    private MediaPlayer player; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     initializeUIElements(); 

     initializeMediaPlayer(); 
    } 

    private void initializeUIElements() { 

     playSeekBar = (ProgressBar) findViewById(R.id.progressBar1); 
     playSeekBar.setMax(100); 
     playSeekBar.setVisibility(View.INVISIBLE); 

     buttonPlay = (Button) findViewById(R.id.buttonPlay); 
     buttonPlay.setOnClickListener(this); 

     buttonStopPlay = (Button) findViewById(R.id.buttonStopPlay); 
     buttonStopPlay.setEnabled(false); 
     buttonStopPlay.setOnClickListener(this); 

    } 

    public void onClick(View v) { 
     if (v == buttonPlay) { 
      startPlaying(); 
     } else if (v == buttonStopPlay) { 
      stopPlaying(); 
     } 
    } 

    private void startPlaying() { 
     buttonStopPlay.setEnabled(true); 
     buttonPlay.setEnabled(false); 

     playSeekBar.setVisibility(View.VISIBLE); 

     player.prepareAsync(); 

     player.setOnPreparedListener(new OnPreparedListener() { 

      public void onPrepared(MediaPlayer mp) { 
       player.start(); 
      } 
     }); 

    } 

    private void stopPlaying() { 
     if (player.isPlaying()) { 
      player.stop(); 
      player.release(); 
      initializeMediaPlayer(); 
     } 

     buttonPlay.setEnabled(true); 
     buttonStopPlay.setEnabled(false); 
     playSeekBar.setVisibility(View.INVISIBLE); 
    } 

    private void initializeMediaPlayer() { 
     player = new MediaPlayer(); 
     try { 
      player.setDataSource("http://streaming.shoutcast.com/Radioawazca?lang=en-ca"); 
      player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { 

      public void onBufferingUpdate(MediaPlayer mp, int percent) { 
       playSeekBar.setSecondaryProgress(percent); 
       Log.i("Buffering", "" + percent); 
      } 
     }); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (player.isPlaying()) { 
      player.stop(); 
     } 
    } 
} 

Erorrログの猫

09-29 20:51:51.278 7852-7852/com.radioawaz.simerpreetjassal.radioawaz E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: com.radioawaz.simerpreetjassal.radioawaz, PID: 7852 
                         java.lang.IllegalStateException 
                          at android.media.MediaPlayer.prepareAsync(Native Method) 
                          at com.radioawaz.simerpreetjassal.radioawaz.MainActivity.startPlaying(MainActivity.java:67) 
                          at com.radioawaz.simerpreetjassal.radioawaz.MainActivity.onClick(MainActivity.java:55) 
                          at android.view.View.performClick(View.java:5198) 
                          at android.view.View$PerformClick.run(View.java:21147) 
                          at android.os.Handler.handleCallback(Handler.java:739) 
                          at android.os.Handler.dispatchMessage(Handler.java:95) 
                          at android.os.Looper.loop(Looper.java:148) 
                          at android.app.ActivityThread.main(ActivityThread.java:5417) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
09-29 20:51:52.978 7852-7852/com.radioawaz.simerpreetjassal.radioawaz I/Process: Sending signal. PID: 7852 SIG: 9 

こんにちは私はオンラインラジオのストリーミングアプリを構築しています。再生ボタンを押しているときにjava.lang.IllegalStateExceptionエラーが発生します。主な活動は次のようになります。

+0

を助けることができます'prepareAsync()' – nandsito

答えて

0

AndroidManifest.xmlファイルに <uses-permission android:name="android.permission.INTERNET"/> を追加してください。 2可能性のある問題があるドキュメントを見てみると

0

  1. 、ネットワークストリーム(https://developer.android.com/reference/android/media/MediaPlayer.html#Permissions)を使用した場合のMediaPlayerは、インターネットのアクセス許可が必要ですが、行動が、その場合ではありませんが、文書化されていません。
  2. 理論上のコードはうまくいくはずですが、エラーによってMedia Playerがerror状態になり、IllegalStateExceptionがスローされます。 MediaPlayerオブジェクトでアクションを実行する前に、https://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener(android.media.MediaPlayer.OnErrorListener)からErrorListenerを追加してください。ドキュメントから

重要セクション:一般に

は、いくつかの再生制御動作は、このようなサポートされていないオーディオ/ビデオフォーマット、不十分インターリーブされたオーディオ/ビデオ、高すぎる解像度等の様々な理由で失敗することができますストリーミングタイムアウトなどを含む。したがって、これらの状況では、エラーの報告と復旧が重要な関心事です。場合によっては、プログラミングエラーのために、無効な状態で再生制御操作を呼び出すこともあります。 OnErrorListenerがsetOnErrorListener(android.media.MediaPlayer.OnErrorListener)を介して事前に登録されている場合、これらのエラー条件すべてで、内部プレーヤエンジンはOnErrorListener.onError()メソッドを呼び出します。

0

このようなplayer.prepareAsync()、中)(あなたのplayer.prepareAsyncを削除()した後、player.prepareを追加します。希望は `前)(` setOnPreparedListenerを実行してみてください、あなたに

private void initializeMediaPlayer() { 
    player = new MediaPlayer(); 
    try { 
     player.setDataSource("http://streaming.shoutcast.com/Radioawazca?lang=en-ca"); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.prepare(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    player.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { 

     public void onBufferingUpdate(MediaPlayer mp, int percent) { 
      playSeekBar.setSecondaryProgress(percent); 
      Log.i("Buffering", "" + percent); 
     } 
    }); 
} 
+0

これは明示的にドキュメントが言っていることに反するものです。データはすぐに利用できない可能性があるため、ストリームリソースは 'prepareAsync'を使用しなければならないとしています。 – Kiskae

関連する問題