我正在为朋友制作一个在线广播流媒体应用程序。当我在物理设备上运行它时,流播放没有问题。但是如果我在Android Studio的内置模拟器上运行它,它会给出以下错误:
E/MediaPlayer: Error (1,-2147483648)
从我所做的研究来看,这意味着只是一个普遍的错误?我试过添加:
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
player.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
} else {
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
我还在清单中添加了访问internet的正确权限。我确信这个问题已经得到了回答,但我找不到任何解决问题的答案。下面是我用来播放流的完整代码:
private void initializeUIElements(View root) {
playSeekBar = root.findViewById(R.id.progressBar1);
playSeekBar.setMax(100);
playSeekBar.setVisibility(View.INVISIBLE);
buttonPlay = root.findViewById(R.id.buttonPlay);
buttonPlay.setOnClickListener(this);
buttonStopPlay = root.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.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
player.start();
}
});
player.prepareAsync();
}
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();
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
player.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
} else {
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
try {
player.setDataSource("http://s5.citrus3.com:8162/stream");
} 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);
}
});
}
@Override
public void onPause() {
super.onPause();
if (player.isPlaying()) {
player.stop();
}
}
使用URLEncoder是一个不错的选择,但是可能有点笨拙(您只需要转义结束部分)。
String url = "http://s5.citrus3.com:8162/stream";
String fixedUrl = url.replaceAll(" ", "%20");
和
player.setDataSource(fixedUrl);
从这里找到您的问题,您的链接正在使用此代码
playme = (Button)findViewById(R.id.playme);
playme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, " " + pl,Toast.LENGTH_SHORT).show();
URL = "http://s5.citrus3.com:8162/stream";
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
stopme.setEnabled(true);
playme.setEnabled(false);
// get data from internet ...
try
{
mp.setDataSource(URL);
}catch(Exception e){
e.printStackTrace();
}
// buffer...
try
{
mp.prepare();
}catch(Exception e){
e.printStackTrace();
}
mp.start();
}
});
我采用了不同的方法并使用了exo player。加载速度更快,错误消失lol
private void initializeUIElements(View root) {
playSeekBar = root.findViewById(R.id.progressBar1);
playSeekBar.setMax(100);
playSeekBar.setVisibility(View.INVISIBLE);
}
@Override
public void onStop() {
super.onStop();
if (Util.SDK_INT >= 24) {
initializeMediaPlayer(root);
}
}
private void initializeMediaPlayer(View root) {
playerView = root.findViewById(R.id.video_view);
player = new SimpleExoPlayer.Builder(getContext()).build();
playerView.setPlayer(player);
MediaItem media = MediaItem.fromUri(revurl);
player.setMediaItem(media);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
player.prepare();
}
@Override
public void onPause() {
super.onPause();
if (Util.SDK_INT < 24) {
releasePlayer();
}
}
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT >= 24) {
initializeMediaPlayer(root);
}
}
@Override
public void onResume() {
super.onResume();
if ((Util.SDK_INT < 24 || player == null)) {
initializeMediaPlayer(root);
}
}
@SuppressLint("InlinedApi")
private void hideUi() {
playerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
private boolean playWhenReady = true;
private int currentWindow = 0;
private long playbackPosition = 0;
private void releasePlayer() {
if (player != null) {
playWhenReady = player.getPlayWhenReady();
playbackPosition = player.getCurrentPosition();
currentWindow = player.getCurrentWindowIndex();
player.release();
player = null;
}
}