5

アプリを作成し、サイトからオーディオをストリーミングします。メニューがあり、ボタンをクリックしてラジオ アクティビティを開くと、読み込みに 8 ~ 20 秒かかり、強制終了することもあります。どんな助けでも素晴らしいでしょうありがとう。

コード:

  public class Radio extends Activity {

private MediaPlayer mp;
private ImageButton pauseicon;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.player_1);

    pauseicon = (ImageButton) findViewById(R.id.pauseicon);
    getActionBar().setDisplayHomeAsUpEnabled(true);

    /**
     * Play button click event plays a song and changes button to pause
     * image pauses a song and changes button to play image
     * */

    String res = "http://216.235.91.36/play?s=magic24point7&d=LIVE365&r=0&membername=&session=magic24point7:0&AuthType=NORMAL&app_id=live365%3ABROWSER&SaneID=24.79.96.172-13316781890137014897763&tag=live365";

    mp = new MediaPlayer();
    try {
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setDataSource(res);
        mp.prepare();
        mp.start();

    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {

    }



    pauseicon.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            // No need to check if it is pauseicon

            if (mp.isPlaying()) {
                mp.pause();
                ((ImageButton) v).setImageResource(R.drawable.playicon);

            } else {
                mp.start();
                ((ImageButton) v).setImageResource(R.drawable.pauseicon);
            }
        }
    });

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);

        if (mp != null)
            if (mp.isPlaying())
                mp.stop();

        mp.release();

        return true;
    default:
        return super.onOptionsItemSelected(item);

    }
}

@Override
public void onBackPressed() {
    if (mp != null) {
        if (mp.isPlaying())
            mp.stop();

        mp.release();
    }

    // there is no reason to call super.finish(); here
    // call super.onBackPressed(); and it will finish that activity for you
    super.onBackPressed();

}

 }
4

1 に答える 1

5

の代わりにprepareAsync()とを使用します。戻るまで UI スレッドをブロックするため、ストリームには推奨されません。これがクラッシュの原因である可能性があります。setOnPreparedListener()prepare()prepare()

mp = new MediaPlayer();
try {
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mp.setDataSource(res);
    mp.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer player) {
            mp.start();
        }
    });
    mp.prepareAsync();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalStateException e) {
    e.printStackTrace();
} catch (IOException e) {

}

http://developer.android.com/reference/android/media/MediaPlayer.html#prepare()

プレーヤーの再生を同期的に準備します。データソースと表示面を設定したら、prepare() または prepareAsync() を呼び出す必要があります。ファイルの場合、MediaPlayer が再生可能になるまでブロックする prepare() を呼び出しても問題ありません。

そうでなければ、ネットワークがボトルネックだと思います。高速化する最速の方法は、サーバー/クライアント通信が高速であることを確認することです。コードに本質的に遅いものはないようです。

于 2013-07-30T16:02:09.323 に答える