Play sound on button click android

后端 未结 11 1218
清酒与你
清酒与你 2020-11-29 16:10

How do I get a button to play a sound from raw when click? I just created a button with id button1, but whatever code I write, all is wrong.

imp         


        
相关标签:
11条回答
  • 2020-11-29 16:49

    This is the most important part in the code provided in the original post.

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

    To explain it step by step:

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

    First is the initialization of the button to be used in playing the sound. We use the Activity's findViewById, passing the Id we assigned to it (in this example's case: R.id.button1), to get the button that we need. We cast it as a Button so that it is easy to assign it to the variable one that we are initializing. Explaining more of how this works is out of scope for this answer. This gives a brief insight on how it works.

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

    This is how to initialize a MediaPlayer. The MediaPlayer follows the Static Factory Method Design Pattern. To get an instance, we call its create() method and pass it the context and the resource Id of the sound we want to play, in this case R.raw.soho. We declare it as final. Jon Skeet provided a great explanation on why we do so here.

    one.setOnClickListener(new OnClickListener(){
    
        public void onClick(View v) {
            //code
        }
    });
    

    Finally, we set what our previously initialized button will do. Play a sound on button click! To do this, we set the OnClickListener of our button one. Inside is only one method, onClick() which contains what instructions the button should do on click.

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

    To play the sound, we call MediaPlayer's start() method. This method starts the playback of the sound.

    There, you can now play a sound on button click in Android!


    Bonus part:

    As noted in the comment belowThanks Langusten Gustel!, and as recommended in the Android Developer Reference, it is important to call the release() method to free up resources that will no longer be used. Usually, this is done once the sound to be played has completed playing. To do so, we add an OnCompletionListener to our mp like so:

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

    Inside the onCompletion method, we release it like so:

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

    There are obviously better ways of implementing this. For example, you can make the MediaPlayer a class variable and handle its lifecycle along with the lifecycle of the Fragment or Activity that uses it. However, this is a topic for another question. To keep the scope of this answer small, I wrote it just to illustrate how to play a sound on button click in Android.


    Original Post

    First. You should put your statements inside a block, and in this case the onCreate method.

    Second. You initialized the button as variable one, then you used a variable zero and set its onClickListener to an incomplete onClickListener. Use the variable one for the setOnClickListener.

    Third, put the logic to play the sound inside the onClick.

    In summary:

    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();
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-11-29 16:49

    Tested and working 100%

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

    This was all we had to do

    if (mp.isPlaying()) {
        mp.stop();
        mp.release();
        mp = MediaPlayer.create(context, R.raw.sound);
    }
    
    0 讨论(0)
  • 2020-11-29 16:49

    All these solutions "sound" nice and reasonable but there is one big downside. What happens if your customer downloads your application and repeatedly presses your button?

    Your MediaPlayer will sometimes fail to play your sound if you click the button to many times.

    I ran into this performance problem with the MediaPlayer class a few days ago.

    Is the MediaPlayer class save to use? Not always. If you have short sounds it is better to use the SoundPool class.

    A save and efficient solution is the SoundPool class which offers great features and increases the performance of you application.

    SoundPool is not as easy to use as the MediaPlayer class but has some great benefits when it comes to performance and reliability.

    Follow this link and learn how to use the SoundPool class in you application:

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

    Youtube: Save Solution

    0 讨论(0)
  • 2020-11-29 16:51

    An edge case: Above every answer is almost correct but I was stuck in an edge case. If any user randomly clicks the button multiple times within a few seconds then after playing some sound it doesn't respond anymore.

    Reason: Initialize Mediaplayer object is very expensive. It also deals with resources (audio file) so it takes some time for it. When users randomly initialize and calling a method of MediaPlayer's methods like start(), stop(), release(), etc can cause IllegalStateException which I faced.

    Solution: Thanks caw for his suggestion in the comment about Android-Audio. It has just a simple two java classes (MusicManager.java, SoundManager.java).

    You can use MusicManager.java if you want to play one-off sound files -

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

    You can use SoundManager.java if you want to play multiple sounds frequently and fast -

    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;
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-11-29 16:56

    The best way to do this is here i found after searching for one issue after other in the LogCat

    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();
    

    Not releasing the Media player gives you this error in LogCat:

    Android: MediaPlayer finalized without being released

    Not resetting the Media player gives you this error in LogCat:

    Android: mediaplayer went away with unhandled events

    So play safe and simple code to use media player.

    To play more than one sounds in same Activity/Fragment simply change the resID while creating new Media player like

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

    and play it !

    Have fun!

    0 讨论(0)
提交回复
热议问题