对不起我的英语,但我来自巴西,我使用谷歌翻译。
好吧,我在这个应用程序中苦苦挣扎,我试图制作一个流媒体在线广播,在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中运行。下面是一个下载项目的链接,你可以看看并帮助我。
答案 0 :(得分:7)
我下载了你的项目,它实际上返回错误代码: E / MediaPlayer(1976):错误(-38,0)
这是在准备好之前启动媒体播放器引起的。
我做了一些改动,但它开始起作用了。你应该:
在MediaPlayer上设置onPrepared监听器(即在onCreate中)
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
从play()方法中删除player.start()
以这种方式设置数据源(在你的play()方法中)
player.setDataSource(this, Uri.parse("http://69.64.48.96:9880/"));
适用于我的HTC Sensation with Android 4.0.3
如果您需要任何帮助,请告诉我。
编辑:我忘了,我也删除了player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
多余
答案 1 :(得分:2)
prepare()
调用可能阻止了UI线程(当你这样做时,android 4.0讨厌它)
你需要在asynctask这样的后台线程中完成这项工作。这是一个实现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's states(播放,准备,停止等)的内容,以了解调用prepare会阻止UI线程的原因(
的更多信息答案 2 :(得分: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();
}
答案 3 :(得分:0)
在后台线程上做任何 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