2016-09-30 27 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

嘗試執行'setOnPreparedListener()'之前'prepareAsync()' – nandsito

回答

0

請在您的AndroidManifest.xml文件中添加 <uses-permission android:name="android.permission.INTERNET"/> 。在文檔

0

尋找可能存在兩個問題:

  1. 的MediaPlayer的要求INTERNET權限如果與網絡流(https://developer.android.com/reference/android/media/MediaPlayer.html#Permissions)使用,但這樣的行爲應該是不會的情況下,不記錄在案。
  2. 理論上的代碼應該可以工作,但是如果出現錯誤,MediaPlayer將處於error狀態,這會使其丟失IllegalStateException。在對MediaPlayer對象執行任何操作之前,通過https://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener(android.media.MediaPlayer.OnErrorListener)添加ErrorListener。從文檔

重要部分:

一般來說,一些播放控制操作可能因爲各種原因,如不支持的音頻/視頻格式,交錯的不良音頻/視頻,分辨率太高,流式超時等。因此,在這些情況下,錯誤報告和恢復是一個重要的問題。有時,由於編程錯誤,也可能發生在無效狀態下調用回放控制操作。在所有這些錯誤情況下,如果通過setOnErrorListener(android.media.MediaPlayer.OnErrorListener)事先註冊了OnErrorListener,則內部播放器引擎會調用用戶提供的OnErrorListener.onError()方法。

0

刪除您player.prepareAsync(),然後在player.prepareAsync()添加player.prepare(),像這樣的:希望能幫助你

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