针对媒体播放器的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错误。主要活动如下所示。
请在您的AndroidManifest.xml文件中添加 <uses-permission android:name="android.permission.INTERNET"/>
。在文档
寻找可能存在两个问题:
- 的MediaPlayer的要求INTERNET权限如果与网络流(https://developer.android.com/reference/android/media/MediaPlayer.html#Permissions)使用,但这样的行为应该是不会的情况下,不记录在案。
- 理论上的代码应该可以工作,但是如果出现错误,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);
}
});
}
这明显违背了文档所说的内容。它表示流式资源必须使用'prepareAsync',因为数据可能不会立即可用。 – Kiskae
尝试执行'setOnPreparedListener()'之前'prepareAsync()' – nandsito