17

ボタンをタップするとMP3を再生するボタンをAndroidアプリに追加しようとしています。私はそれを動作させましたが、mediaPlayerオブジェクトを解放する方法がありません-したがって、アクティビティを終了した後も再生を続けます。react()メソッド(ボタンが押されたときに呼び出されるもの)の外部でMediaPlayerオブジェクトを初期化すると、アクティビティが開かれたときにアプリが強制的に閉じられます。しかし、react()メソッド内でMediaPlayerを初期化すると、onQuit()メソッドでmplayer.releaseを使用できなくなります。ここに何が見えないのですか?

    public void react(View view) {
    MediaPlayer mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
    mediaPlayer.start();
}
protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}

明らかな理由で機能せず、

MediaPlayer mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
public void react(View view) {
            mediaPlayer.start(); 
}
protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}

強制的に閉じます。

更新: これがJavaクラス全体です。

public class ToBeOrNot extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_to_be_or_not);

        }
MediaPlayer mediaPlayer;

public void react(View view) {
        mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
        mediaPlayer.start(); 
}
protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    //getMenuInflater().inflate(R.menu.activity_to_be_or_not, menu);
    // Locate MenuItem with ShareActionProvider
   return true;
}

}

私はそれが何をするかは比較的自明だと思います。呼び出されると、テキストとボタンが表示され、タップすると録音の再生が開始されます。誰かが戻るボタンを押すと、前のアクティビティに戻って録音を停止する必要があります。私を助けてくれてありがとう!

4

3 に答える 3

26

すべてのメソッドの外部でmediaplayerオブジェクトを初期化することはできません。そうした場合、まだ作成されていないコンテキストを使用しようとします。これをクラス変数(メソッドの外部)として宣言し、内部で初期化する必要があります。

MediaPlayer mediaPlayer;

public void react(View view) {
    mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
    mediaPlayer.start(); 
}

protected void onStop(){
    mediaPlayer.release();
    mediaPlayer = null;
}

さらに、Javaの変数スコープを読むことをお勧めします。

于 2013-02-23T22:00:46.097 に答える
1

これは私にとってうまくいきました。

public class MainActivity extends AppCompatActivity {

    MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mediaPlayer = MediaPlayer.create(this, R.raw.beep_warning);

        final CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox);
        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (checkBox.isChecked()) {
                    mediaPlayer.start();
                    mediaPlayer.setLooping(true);
                }
                else{
                    mediaPlayer.pause();
                }
                }


        });

    }
    @Override
    protected void onStop() {
        super.onStop();
        mediaPlayer.release();
    }
于 2017-04-25T10:59:38.707 に答える
1

Googleドキュメントによると、次の例のようにリスナーを実装できますMediaPlayer

完了したら、自動的にリリースおよびリセットできます。

MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();
于 2020-10-19T16:37:23.490 に答える