5

对不起我的英语,但我来自巴西,我使用了谷歌翻译。

好吧,我在这个应用程序中苦苦挣扎,我试图将流媒体制作成在线广播,在 2.2 版中运行良好,但 4.0 版不起作用。没有错误发生,根本不起作用。下面是我的代码。

我很感激任何帮助。

package com.radiomiriam;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class Main extends Activity {
public String url = "http://69.64.48.96:9880";
public MediaPlayer player = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    play();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void stop(){
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show();
    if(player.isPlaying()){
        player.stop();
    }
}

public void play(){
    if(player.isPlaying()){
        Toast.makeText(getApplicationContext(), "Já está em execução!", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
        try {
            player.setDataSource(url);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.start();
    }
}

public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        play();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}
}

您好,请原谅我的坚持,但我的问题仍然没有找到解决方案,不知道如何解决,我再次请求您帮助解决这个问题。

该应用程序在 2.x 和 3.x 版本中运行,但不在 4.x 版本中运行。以下是下载该项目的链接,您可以查看并帮助我。

http://nsi.inf.br/RadioMiriam.rar(已删除)

4

4 回答 4

6

我下载了你的项目,它实际上返回错误代码:E/MediaPlayer(1976): error (-38, 0)

这是由在准备好之前启动媒体播放器引起的。

我做了一些改变,它开始工作了。你应该 :

  1. 在 MediaPlayer 上设置 onPrepared 监听器(即在 onCreate 中)

    player.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
    
  2. 从您的 play() 方法中删除 player.start()

  3. 以这种方式设置数据源(在你的 play() 方法中)

    player.setDataSource(this, Uri.parse("http://69.64.48.96:9880/"));
    

它适用于我的 HTC Sensation 与 Android 4.0.3

如果您需要任何帮助,请告诉我。

编辑:我忘了,我也删除了

player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

这是多余的

于 2013-03-07T09:31:50.257 回答
2

prepare()调用可能阻塞了 UI 线程(当你这样做时,android 4.0 讨厌它)

您需要在异步任务等后台线程中完成这项工作。这是实现 AsyncTask 以play()在后台运行的匿名版本。

public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
                play();
                return null;
            }
        }.execute();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}

您需要阅读一些有关MediaPlayer 状态 (播放、准备、停止等)的信息,以了解调用 prepare 会阻塞 UI 线程的原因(

有关AsyncTasks的更多信息

于 2013-02-22T20:32:26.930 回答
0

您尚未在 .xml 文件中的按钮和代码之间设置任何链接。即使您按下按钮,也永远不会调用 onClick 方法。

用这个替换你的 onCreate 方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button playButton = (Button) findViewById(R.id.btnPlay);
    playButton.setOnClickListener(this);
    Button stopButton = (Button) findViewById(R.id.btnStop);
    stopButton.setOnClickListener(this);
    play();
}
于 2013-02-22T20:42:30.173 回答
0

在 android 中,在后台线程上做任何IO工作总是更好。

这包括 MediaPlayer 。但在 MediaPlayer 的情况下,您已经有了prepareAsync()在后台为您准备 MediaPlayer 的方法。

一个很好的方法是这样的:

package com.radiomiriam;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class Main extends Activity  implements OnPreparedListener{
public String url = "http://69.64.48.96:9880";
public MediaPlayer player = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    play();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void stop(){
    Toast.makeText(getApplicationContext(), "Finalizando...", Toast.LENGTH_SHORT).show();
    if(player.isPlaying()){
        player.stop();
    }
}

public void play(){
    if(player.isPlaying()){
        Toast.makeText(getApplicationContext(), "J? est? em execuç?o!", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(), "Preparando...", Toast.LENGTH_SHORT).show();
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
        try {
            player.setDataSource(url);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.setOnPreparedListener(this);
            player.prepareAsync();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
}
@Override
public void onPrepared(MediaPlayer mp) {
    // TODO Auto-generated method stub
    mp.start();
}
public void onClick(View v) {
    final int id = v.getId();
    switch (id) {
    case R.id.btnPlay:
        play();
        break;
    case R.id.btnStop:
        stop();
        break;
    }
}
}

此外,阅读文档始终是一个好习惯,因此这里是 MediaPlayer API 的链接:MediaPlayer

于 2013-02-23T17:58:47.683 回答