针对媒体播放器的java.lang.IllegalStateException

问题描述:

嗨,我正在构建在线广播流应用程序。当我按下播放按钮时,出现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

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

寻找可能存在两个问题:

  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()方法。

删除您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