0

音楽をストリーミングするアプリを作成しています。serviceバックグラウンドでオンライン mp3 ファイルから音楽を再生するために を使用しています。しかし、サービスは で停止しprepareAsync()、準備が完了しないため、音楽の再生は開始されません。すなわち。onPrepared()メソッドが呼び出されることはありません。注: 同じコードactivityを a の代わりに使用しましたがservice、この問題は発生しません。ここで何が問題なのですか?コード:

public class mp3playerservice extends IntentService implements OnPreparedListener {
    String track;
    String info[];
    String name;
    MediaPlayer mp;
    Bundle extras;


  public mp3playerservice() {
    super("mp3playerservice");
  }

  // Will be called asynchronously be Android
  @Override
  protected void onHandleIntent(Intent intent) {
    extras = intent.getExtras();
    info=extras.getStringArray("info");
    track=info[1];
    name=info[0];
    mp= new MediaPlayer();
    if(mp.isPlaying()){
        mp.release();
        mp=new MediaPlayer();
    }
    start1(track);
    }

    void start1(String a){

        try{
        mp.setDataSource(a);
        mp.setOnPreparedListener(this);
        mp.prepareAsync();
        }catch(Exception e){
            Log.d("error is "+e.toString(),"error came up");
        }

    }


  public void onPrepared(MediaPlayer mp4){

        mp.start();
        Log.d("in here2","okay");
    }


} 
4

1 に答える 1

2

生成された logcat も投稿していただければ幸いです。ただし、 IntentService からサブクラス化しているため、 prepareAsync() への呼び出しが完了すると、サービスが停止するようです。その理由は、その時点でインテントの処理が効果的に終了したためです。この時点で、これを修正するにはいくつかの異なる方法があります。最良の方法ではありませんが、最も簡単な方法は、コードを変更して、 prepareAsync() の代わりに prepare() を呼び出してから start() プレーヤーを呼び出し、onPreparedListener を登録する行もコメントアウトすることです。私の意見では、Service から直接サブクラス化し、onStartCommand() をオーバーライドするのが最善の方法です。

于 2013-04-28T17:16:56.773 に答える