我在这里的第一篇文章。这个网站对学习Android编程非常有用,感谢大家。
我有一个简单的应用程序可以加载 MP3 流并播放它。它在 1.6 和 2.1 上运行良好,但在 2.2 上运行不正常。似乎我的服务启动时出现问题,它给了我一个 ANR 和我必须点击“等待”的对话框,然后服务终于启动了。为什么服务需要很长时间才能启动?
这是我设置源并播放音频的简单代码:
public class MyActivityService extends Service {
MediaPlayer player = new MediaPlayer();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
try {
player.setDataSource("URL OF MUSIC FILE");
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
player.prepare();
player.setVolume(1, 1);
player.setLooping(true);
player.start();
Toast.makeText(getApplicationContext(), "Audio Service Started.", Toast.LENGTH_SHORT).show();}
附录:
原来不是我的服务没有启动,而是音频在 2.2 中启动不够快......
当我的服务启动和停止时,我通过将我的服务的onCreate()
和onDestroy()
方法放在它们自己的线程中来摆脱 ANR,这可能从一开始就应该是这样的?不好意思,刚学。
但是真正的问题仍然是延迟,澄清一下——
例如,当我将数据源设置为这样的 MP3 文件时,我的代码现在可以正常工作,而且在 2.1 和 2.2 中我希望它是这样的: http: //dl.dropbox.com/ u/6916184/TestSongStream.mp3
但是当我将数据源设置为这样的音频流位置时: http: //d.liveatc.net/kjfk_twr或此:http ://relay.radioreference.com:80/192236577它仅在 2.1 中正常工作。
在 2.2 中,声音最终会开始播放,但在设置数据源后,“StagefrightPlayer”大约需要 25 秒左右,直到音频开始播放,如下所示:
07-31 02:54:30.176: INFO/StagefrightPlayer(34): setDataSource('http://relay.radioreference.com:80/192236577')
07-31 02:54:55.228: INFO/AwesomePlayer(34): calling prefetcher->prepare()
07-31 02:54:56.231: INFO/Prefetcher(34): [0x2cc28] cache below low water mark, filling cache.
07-31 02:54:56.337: INFO/AwesomePlayer(34): prefetcher is done preparing
07-31 02:54:56.347: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12
07-31 02:54:57.337: ERROR/AwesomePlayer(34): Not sending buffering status because duration is unknown.
在我的服务方法中player.stop()
调用之后,停止媒体播放器也需要相同的时间,大约 25 秒,然后该方法继续 Toast 消息并取消通知。onDestroy()
onDestroy()
这就是2.2的方式吗?如果是这样,我可以解决延迟问题,这不是问题。或者更有可能是我做错了什么?但它在 1.6 和 2.1 中完全符合我的要求!
发布更多代码会有所帮助吗?
我的代码非常简单。没有音频控件或类似的东西。只需一个启动音频按钮和停止音频按钮,即可启动和停止播放音频流的服务。
感谢您的任何帮助!