ここに私の最初の投稿。このウェブサイトは、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 で私が望むように正確に動作します!
より多くのコードを投稿すると役立ちますか?
私のコードはとてもシンプルです。オーディオコントロールなどはありません。オーディオ ストリームを再生するサービスを開始および停止する、オーディオの開始ボタンとオーディオの停止ボタンだけです。
助けてくれてありがとう!