2013-02-23 4 views
10

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

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; 
} 

} 

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

+0

あなたの他の質問に回答したが、新しい質問をしたい場合は、単にこの質問を編集するのではなく、新しい質問を開く必要があります。 – Geobits

+0

申し訳ありませんが、私はあまりにも多くの質問をしたくありませんでした。 – dacelbot

+0

新しい質問があります。 http://stackoverflow.com/questions/15046888/android-mediaplayer-causing-force-close-onquitそれが素晴らしいと答えるように感じる場合は、ありがとう。他の誰かがそうするかもしれない、あるいは私は自分自身で答えを出すかもしれない。 – dacelbot

答えて

14

すべてのメソッドの外で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; 
} 

また、私はvariable scope in Java上に読んでお勧めします:あなたは(メソッドの外側)クラス変数として宣言し、内部にそれを初期化する必要があります。

+0

ああ、ありがとう!それは本当にばかな間違いでした。スコープは私が問題を抱えていることに気づいたが、私の脳は機能していなかったので、それを修正する方法を考えることができなかった。 – dacelbot

+0

私はあなたの例をコピーし、今は正常に動作しますが、サウンドを開始するボタンを押した後に戻るボタンを押すと、アプリケーションの強制は終了します。何かご意見は? – dacelbot

+0

それには潜在的な問題がたくさんあります。私は、あなたがライフサイクルのすべての方法(作成、再開、一時停止、停止など)で何をしているのかを説明する別の質問をすることをお勧めします。また、あなたが何をしたいのか正確に説明してください。 – Geobits

0

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

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(); 
    } 
関連する問題