Düğmeye tıklama android'de ses çal


109

Tıklandığında işlenmemiş bir ses çalmak için bir düğmeyi nasıl edinebilirim? İd ile bir düğme oluşturdum button1, ancak yazdığım kod ne olursa olsun, hepsi yanlış.

import android.media.MediaPlayer;

public class BasicScreenActivity extends Activity {

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

    Button one = (Button)this.findViewById(R.id.button1);
    MediaPlayer = mp;
    mp = MediaPlayer.create(this, R.raw.soho);
    zero.setOnCliclListener(new View.OnClickListener() )

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.basic_screen, menu);
        return true;
    }



}

1
Muhtemelen arayabilmeniz için kaynakların otomatik olarak yönetilmesini istersiniz MusicManager.getInstance().play(this, R.raw.my_sound);. Öyleyse, bu kitaplık size uygun olabilir: github.com/delight-im/Android-Audio
caw

Yanıtlar:


228

Bu, orijinal gönderide verilen koddaki en önemli kısımdır.

Button one = (Button) this.findViewById(R.id.button1);
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        mp.start();
    }
});

Adım adım açıklamak için:

Button one = (Button) this.findViewById(R.id.button1);

Birincisi, sesin çalınmasında kullanılacak düğmenin başlatılmasıdır. İhtiyacımız olan düğmeyi elde etmek için, findViewByIdkendisine atadığımız Kimliği (bu örnekte:) geçerek Aktiviteleri kullanırız R.id.button1. Onu başlattığımız Buttondeğişkene atamanın kolay olması için bir oneatıyoruz. Bunun nasıl çalıştığını daha fazla açıklamak bu yanıt için kapsam dışıdır. Bu , nasıl çalıştığına dair kısa bir fikir verir.

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

Bu, a MediaPlayer. MediaPlayer, Statik Fabrika Yöntemi Tasarım Modelini izler . Bir örnek almak için, create()yöntemini çağırıyoruz ve bu durumda çalmak istediğimiz sesin bağlamını ve kaynak kimliğini iletiyoruz R.raw.soho. Olarak ilan ediyoruz final. Jon Skeet, burada neden böyle yaptığımıza dair harika bir açıklama yaptı .

one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        //code
    }
});

Son olarak, önceden başlatılmış butonumuzun ne yapacağını belirledik. Düğmeye tıklandığında bir ses çalın! Bunu yapmak için, biz set OnClickListenerbizim düğmeye one. İçinde yalnızca bir yöntem olduğunu onClick()ne yapması gerektiğini talimatlar düğmesi bulunur tıklamada .

public void onClick(View v) {
    mp.start();
}

Sesi çalmak için MediaPlayer start()yöntemini çağırıyoruz . Bu yöntem, sesin çalınmasını başlatır.

Orada, artık Android'de düğme tıklandığında bir ses çalabilirsiniz!


Bonus kısmı:

Aşağıdaki yorumda belirtildiği gibi Teşekkürler Langusten Gustel! ve Android Geliştirici Referansında önerildiği gibi,release() artık kullanılmayacak kaynakları serbest bırakmak için yöntemi çağırmak önemlidir . Genellikle bu, çalınacak sesin çalması tamamlandıktan sonra yapılır. Bunu yapmak için, biz eklemek OnCompletionListenerbizim için mp şöyle:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        //code
    }
});

onCompletionYöntemin içinde şu şekilde yayınlıyoruz :

public void onCompletion(MediaPlayer mp) {
    mp.release();
}

Bunu uygulamanın daha iyi yolları var . Örneğin, MediaPlayer'ı bir sınıf değişkeni yapabilir ve yaşam döngüsünü, onu kullanan Fragmentveya Activitykullanan kişinin yaşam döngüsü ile birlikte yönetebilirsiniz . Ancak bu başka bir soru için bir konudur. Bu cevabın kapsamını küçük tutmak için, bunu Android'de bir düğme tıklandığında nasıl ses çalınacağını göstermek için yazdım .


Orijinal Gönderi

İlk. İfadelerinizi bir bloğun içine ve bu durumda onCreate yöntemine koymalısınız.

İkinci. Düğmeyi değişken bir olarak başlattınız , sonra bir sıfır değişkeni kullandınız ve onun onClickListener'ını tamamlanmamış bir onClickListener olarak ayarladınız. Değişken kullanın birini setOnClickListener için.

Üçüncüsü, sesi onClick içinde çalmak için mantığı koyun.

Özetle:

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class BasicScreenActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);

        Button one = (Button)this.findViewById(R.id.button1);
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
        one.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                mp.start();
            }
        });
    }
}

1
Ve bu arada, one.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Bunu kaçırmayın!
Auto-Droid ツ

7
don't for get toRELEASE
Langusten Gustel

38

% 100 test edildi ve çalışıyor

public class MainActivity extends ActionBarActivity {
    Context context = this;
    MediaPlayer mp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        mp = MediaPlayer.create(context, R.raw.sound);
        final Button b = (Button) findViewById(R.id.Button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    if (mp.isPlaying()) {
                        mp.stop();
                        mp.release();
                        mp = MediaPlayer.create(context, R.raw.sound);
                    } mp.start();
                } catch(Exception e) { e.printStackTrace(); }
            }
        });
    }
}

Tüm yapmamız gereken buydu

if (mp.isPlaying()) {
    mp.stop();
    mp.release();
    mp = MediaPlayer.create(context, R.raw.sound);
}

Bu, sesi tekrar oynatırken de çalışır. Ses çalarken mp.start () 'ın try / catch ve if blokları olmadan çalışacağını düşünüyorum.
khwilo

37

Bunu yapmanın en iyi yolu, LogCat'ta birbiri ardına bir sorunu aradıktan sonra bulduğum burada.

MediaPlayer mp;
mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();

Değil bırakmadan Medya oynatıcı size LogCat bu hatayı veriyor:

Android: MediaPlayer yayınlanmadan sonlandırıldı

Değil sıfırlama Medya oynatıcı size LogCat bu hatayı veriyor:

Android: Mediaplayer, işlenmeyen olaylarla ortadan kayboldu

Bu nedenle, medya oynatıcıyı kullanmak için güvenli ve basit bir kod oynayın.

Aynı Aktivite / Parçada birden fazla ses çalmak için, basitçe resID'yi değiştirin ve yeni bir Medya oynatıcı oluştururken

mp = MediaPlayer.create(context, R.raw.sound_two);

ve oyna!

İyi eğlenceler!


8
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    MediaPlayer mp;
    Button one;

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

        mp = MediaPlayer.create(this, R.raw.soho);
        one = (Button)this.findViewById(R.id.button1);

        one.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mp.start();
            }
        });
    }
}

İşte sonuç, yine hiçbir şey işe yaramıyor dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry

Mp = new MediaPlayer () satırına ihtiyacınız yoktur çünkü sonraki satırda MediaPlayer.create (...) kullanarak onu yeniden başlatıyorsunuz.
Keale

6
  • Ses, rawklasöre yerleştirilmelidir , yoksa bir tane oluşturun.
  • Ham klasör, res klasörünün içinde olmalıdır
  • Adın içinde herhangi bir -özel karakter olmamalıdır .

Aktivitenizde, yöntem veya yöntemin MediaPlayeriçinde bir nesneye sahip olmanız gerekir , ses dosyanızı başlatmanız gerekir , örneğin , sizin durumunuzda, sizin durumunuzda olmasını istediğiniz için , çağrı ile çalınmaya hazır bir düğmeye yerleştirdiğinizde, onu yöntemin içine koymanız gerekir .onCreateonclickMediaPlayerMediaPlayer.create(this, R.raw.name_of_your_audio_file)start()onClick

Misal:

private Button myButton;
private MediaPlayer mp;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        mp = MediaPlayer.create(this, R.raw.gunshot);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });
}
}

3

önceden tanımlanmış bazı sesler vardır: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Güzel!

MediaActionSound

Medya ve kamera API'leri tarafından gerçekleştirilen çeşitli eylemlerle üretilenlerle eşleşen sesler üretmek için bir sınıf. Dokümanlar

gibi kullanın:

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}

2
Button button1=(Button)findViewById(R.id.btnB1);
button1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer mp1 = MediaPlayer.create(this, R.raw.b1);
mp1.start();
}
});

Bunu dene, işe yarayacağını düşünüyorum


1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

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

    }

düğmeye basıldığında çağrılabilen bir yöntemle düğme oluşturma (onCreate),

sonra dosyanızın yoluyla (MediaPlayer) sınıfı için bir değişken oluşturun

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

sonunda o sınıfta başlangıç ​​yöntemini çalıştırın

mp.start();

düğmeye basıldığında dosya çalışacaktır, umarım bu yardımcı olmuştur!


3
Stack Overflow'a hoş geldiniz! Gelecekteki okuyucuların sizden öğrenebilmesi için kodunuza biraz açıklama ve yorum eklemeniz daha iyi olur.
Mehdi Bounya

1

DeathRs tarafından önerildiği gibi sıfırlamak yerine:

if (mp.isPlaying()) {
       mp.stop();
       mp.release();
       mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();

MediaPlayer'ı kullanmaya başlayacak şekilde sıfırlayabiliriz:

if (mp.isPlaying()) {
       mp.seekTo(0)
}

1

Tüm bu çözümler kulağa hoş ve makul geliyor ama büyük bir dezavantajı var. Müşteriniz uygulamanızı indirir ve tekrar tekrar düğmenize basarsa ne olur?

Sizin MediaPlayerbirçok kez butonuna tıklayın eğer bazen ses çıkarması için başarısız olur.

MediaPlayerBirkaç gün önce sınıfta bu performans sorunuyla karşılaştım .

MediaPlayersınıf kullanımına tasarrufu? Her zaman değil. Kısa sesleriniz varsa, SoundPoolsınıfı kullanmak daha iyidir .

Harika özellikler sunan ve uygulamanızın performansını artıran SoundPool sınıfı, tasarruflu ve verimli bir çözümdür.

SoundPool'un kullanımı MediaPlayersınıf kadar kolay değildir, ancak performans ve güvenilirlik söz konusu olduğunda bazı büyük faydaları vardır.

Bu bağlantıyı takip edin ve uygulamanızda SoundPool sınıfını nasıl kullanacağınızı öğrenin:

https://developer.android.com/reference/android/media/SoundPool

Youtube: Çözümü Kaydet


0

Uç bir durum: Her cevabın üstünde neredeyse doğrudur ama bir uç durumda sıkışıp kaldım. Herhangi bir kullanıcı birkaç saniye içinde düğmeyi rastgele birkaç kez tıklarsa, bir ses çaldıktan sonra artık yanıt vermez.

Sebep: Başlatma Mediaplayernesnesi çok pahalıdır. Aynı zamanda kaynaklarla ( ses dosyası ) da ilgilenir, bu yüzden biraz zaman alır. Kullanıcıların rastgele initialize ve bir yöntem ararken MediaPlayergibi dediniz yöntemlerle start(), stop(), release()vb neden olabilir IllegalStateExceptionben karşı karşıya olan.

Çözüm: Android-Audio hakkındaki yorumdaki önerisi için teşekkürler . Sadece iki basit java sınıfına ( , ) sahiptir.MusicManager.javaSoundManager.java

Tek seferlik ses dosyalarınıMusicManager.java çalmak istiyorsanız kullanabilirsiniz -

MusicManager.getInstance().play(MyActivity.this, R.raw.my_sound);

Birden fazla sesi sık ve hızlı birSoundManager.java şekilde çalmak istiyorsanız kullanabilirsiniz -

class MyActivity extends Activity {

    private SoundManager mSoundManager;

    @Override
    protected void onResume() {
        super.onResume();

        int maxSimultaneousStreams = 3;
        mSoundManager = new SoundManager(this, maxSimultaneousStreams);
        mSoundManager.start();
        mSoundManager.load(R.raw.my_sound_1);
        mSoundManager.load(R.raw.my_sound_2);
        mSoundManager.load(R.raw.my_sound_3);
    }

    private void playSomeSound() {
        if (mSoundManager != null) {
            mSoundManager.play(R.raw.my_sound_2);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mSoundManager != null) {
            mSoundManager.cancel();
            mSoundManager = null;
        }
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.