2

私は Android にかなり慣れていないので、これがばかげた質問ではないことを願っていますが、MediaPlayer で状態の変更を処理するのに問題があります。メディアプレーヤーは画面上で正常に動作し、画面が表示されていない間もサウンドを再生し続けますが、アクティビティに戻ってメディアプレーヤーを停止しようとしても停止しません。onPause と onResume で保存して復元できる mp から streamID を取得する方法がわかりません。私が見逃している単純なものがあるに違いありません。ここに私がこれまでに持っているもののいくつかのスニペットがあります:

    public class Noise extends Activity {
       public MediaPlayer mp;

     public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layour.main);

        Button startButton = (Button)findViewById(R.id.startButton);
        Button stopButton = (Button)findViewById(R.id.stopButton);

        mp = MediaPlayer.create(this, R.raw.noise);

        startButton.setOnClickListener(new OnClickListener(){
             @Override
             public void onClick(View v){
                 playSoundLoop();
                 }
               });

        stopButton.setOnClickListener(new OnClickListener(){
             @Override
             public void onClick(View v){
                 stopSound();
                 }
               });
       }

    public void playSoundLoop(){
         mp.setLooping(true);
         mp.start();
     }

    public void stopSound(){
         mp.pause();
         //Had originally tried mp.stop, mp.reset, mp.prepare, but that didn't work any better
     }

}

4

1 に答える 1

2

元の MediaPlayer インスタンスの割り当てを解除しているとは思いません。そのため、アクティビティonCreate()を終了して戻ると、 が再度呼び出され、メモリ不足により古いインスタンスが解放されるまで、2 つのインスタンスが作成されます。

簡単な解決策は、アクティビティがフォアグラウンドを離れるときに解放することです。次に例を示します。

@Override
    onPause() {
    mp.release();
    super.onPause();
}

ただし、音楽をバックグラウンドで再生し続けたい場合は、MediaPlayer 参照をアクティビティ ライフサイクルの外 (おそらくサービス) に移動する必要があります。

于 2011-06-16T15:38:24.550 に答える