0

ここに私の最初の投稿。このウェブサイトは、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 秒) かかり、メソッドはメッセージをトーストして通知をキャンセルします。onDestroy()onDestroy()

2.2でもそうなのか?もしそうなら、私は遅延を回避できます。それは問題ではありません。それとも、私が間違っている可能性が高いですか?しかし、それは 1.6 と 2.1 で私が望むように正確に動作します!

より多くのコードを投稿すると役立ちますか?

私のコードはとてもシンプルです。オーディオコントロールなどはありません。オーディオ ストリームを再生するサービスを開始および停止する、オーディオの開始ボタンとオーディオの停止ボタンだけです。

助けてくれてありがとう!

4

1 に答える 1

1

特にストリームの場合は、メイン アプリケーション スレッドから呼び出さないでくださいprepare()。ANR の前に許可されているよりもはるかに長い時間がかかる可能性があるためです。prepareAsync()代わりに使用してください。それがあなたの特定の問題の根源であるかどうかはわかりませんが、現在の実装では確かに ANR の原因の 1 つです。

于 2010-07-31T01:36:47.387 に答える