2013-02-23 41 views
10

Düğmeye dokunulduğunda bir MP3 çalarken Android uygulamasına bir düğme eklemeye çalışıyorum. Çalıştığımı gördüm, ancak mediaPlayer nesnesini serbest bırakmanın bir yolu olmadan - bu yüzden etkinliği bıraktıktan sonra bile oynamaya devam ediyor. MediaPlayer nesnesini benim tepki() yöntemimin dışında başlatırsam (düğmeye basıldığında ne çağrılır), uygulamanın açıldığı zaman uygulamanın zorlanmasını sağlar. Ancak MediaPlayer'ı react() yönteminde başlatırsam, onquit() yönteminde mplayer.release kullanamazdım. Ne görmüyorum burada? Android MediaPlayer nasıl düzgün şekilde serbest bırakılır

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

bilinen nedenlerle çalışmıyor mu ve

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

yakın zorlamak neden olur.

Güncelleme: İşte tüm java sınıfıdır.

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

} 

Sanırım ne yaptığı, göreceli olarak açıklayıcıdır. Arandığında, bir metin ve dokunulduğunda bir kaydı oynatmaya başladığında bir düğme gösterir. Birisi arka tuşa bastığında, önceki etkinliğe geri dönmeli ve kaydı durdurmalıdır. Yardımın için teşekkürler!

+0

Diğer sorunuz yanıtlandıysa ve yeni bir soru sormak isterseniz, yeni bir soru açmanız yeterlidir, yalnızca bunu düzeltmeyin. – Geobits

+0

Pekala, sadece çok fazla soru sormak istemedim. – dacelbot

+0

İşte yeni soru. http://stackoverflow.com/questions/15046888/android-mediaplayer-causing-force-close-onquit Eğer cevap vermek istediğinizi düşünüyorsanız bu harika olur, teşekkürler. Ya da başka biri olabilir, ya da ben kendi kendime cevap olarak gelebilirim. – dacelbot

cevap

14

Mediaplayer nesnesini tüm yöntemlerin dışında başlatamazsınız. Eğer yaparsanız, henüz oluşturulmamış bir bağlamı kullanmaya çalışır.

MediaPlayer mediaPlayer; 

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

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

Ayrıca, ben variable scope in Java üzerinde okumanızı öneririz: Sen (yöntemiyle dışında) bir sınıf değişkeni olarak beyan ve içine başlatmak gerekiyor.

+0

Ah, çok teşekkürler! Bu gerçekten aptal bir hataydı. Bu kapsamın benim sorunum olduğunu farkettim, ama beynim çalışmıyordu ve bunu nasıl düzelteceğimi düşünemedim. – dacelbot

+0

Bu yüzden, örneğinizi kopyaladım ve şimdi iyi çalışıyor ancak sesi başlatan düğmeye bastıktan sonra arka düğmeye bastığımda, uygulama kuvveti kapanıyor. Düşüncesi olan var mı? – dacelbot

+0

Bununla ilgili birçok potansiyel sorun var. Tüm yaşam döngüsü yöntemlerinde yaptığınız şeyi (yaratma, devam ettirme, duraklatma, durdurma, vb.) Açıklayan başka bir soru yapmayı öneririm. Ayrıca, tam olarak ne istediğinizi * nasıl * açıklayınız. – Geobits

0

Bu benim için iyi çalıştı.

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(); 
    } 
İlgili konular