Search code examples
androidandroid-mediaplayer

Audio crashes after pressing the buttons a few times


I have 8 buttons in a 4x2 Grid Layout each with a text of a random English word or phrase. Each button plays a very short audio file translating the word or phrase into French.

Once I press the buttons a few times, all the buttons stop working anymore. The only way the app works again is by shutting down the emulator completely and starting it up again.

Here is the Java code:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    public void onClick(View view) {
        switch(view.getId())
        {
            case R.id.button1:
                Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.hello).start();
                break;
            case R.id.button2:
                Toast.makeText(this, "How are you?", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.howareyou).start();
                break;
            case R.id.button3:
                Toast.makeText(this, "My name is", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.mynameis).start();
                break;
            case R.id.button4:
                Toast.makeText(this, "Do you speak English?", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.doyouspeakenglish).start();
                break;
            case R.id.button5:
                Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.goodevening).start();
                break;
            case R.id.button6:
                Toast.makeText(this, "Please", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.please).start();
                break;
            case R.id.button7:
                Toast.makeText(this, "Welcome", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.welcome).start();
                break;
            case R.id.button8:
                Toast.makeText(this, "I live in", Toast.LENGTH_SHORT).show();
                MediaPlayer.create(this, R.raw.ilivein).start();
                break;
        }
    }


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

//        ViewGroup grid = (ViewGroup) findViewById(R.id.gridLayout);
//        for(int count = 0; count < grid.getChildCount(); count++) {
//            View childView = grid.getChildAt(count);
//            int resID = childView.getId();
//            Log.i("ID", Integer.toString(resID));
//            findViewById(resID).setOnClickListener(this);
//        }

        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);
        findViewById(R.id.button4).setOnClickListener(this);
        findViewById(R.id.button5).setOnClickListener(this);
        findViewById(R.id.button6).setOnClickListener(this);
        findViewById(R.id.button7).setOnClickListener(this);
        findViewById(R.id.button8).setOnClickListener(this);

    }
}

The error is the following:

D/MediaPlayer: setSubtitleAnchor in MediaPlayer
E/EGL_emulation: tid 2462: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH)
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x956ee900, error=EGL_BAD_MATCH
E/MediaPlayer: error (1, -19)
E/MediaPlayer: Error (1,-19)

I have a feeling it has something to do with not closing some sort of a resource, the audio files I guess.

I doubt the XML code is relevant but here it is anyway:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.mustafa.gridlayoutdemo.MainActivity">

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/gridLayout">
        <Button
            android:text="Hello"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button1"

            android:layout_row="0"
            android:layout_column="0"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>

        <Button
            android:text="how are you"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button2"

            android:layout_row="0"
            android:layout_column="1"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>

        <Button
            android:text="my name is"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button3"

            android:layout_row="1"
            android:layout_column="0"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>

        <Button
            android:text="do you speak english"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button4"

            android:layout_row="1"
            android:layout_column="1"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>

        <Button
            android:text="good evening"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button5"

            android:layout_row="2"
            android:layout_column="0"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>

        <Button
            android:text="please"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button6"

            android:layout_row="2"
            android:layout_column="1"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>

        <Button
            android:text="welcome"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button7"

            android:layout_row="4"
            android:layout_column="0"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>

        <Button
            android:text="i live in"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button8"

            android:layout_row="4"
            android:layout_column="1"
            android:layout_gravity="fill"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"/>
    </GridLayout>
</RelativeLayout>

Solution

  • You should use only one MediaPlayer object and stop previous call before initiating/playing new media file. Here is a revised code which might be helpful -

    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
    private MediaPlayer mp = new MediaPlayer();
    
    @Override
    public void onClick(View view) {
        switch(view.getId())
        {
            case R.id.button1:
                if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.hello);
                mp.start();
                break;
            case R.id.button2:
                 if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "How are you?", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.howareyou)
                mp.start();
                break;
            case R.id.button3:
                if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "My name is", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.mynameis);
                mp.start();
                break;
            case R.id.button4:
                 if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "Do you speak English?", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.doyouspeakenglish);
                mp.start();
                break;
            case R.id.button5:
                 if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "Good Evening", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.goodevening);
                mp.start();
                break;
            case R.id.button6:
                 if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "Please", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.please);
                mp.start();
                break;
            case R.id.button7:
                 if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "Welcome", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.welcome);
                mp.start();
                break;
            case R.id.button8:
                 if(mp.isPlaying()){
                    stopPlaying();
                }
                Toast.makeText(this, "I live in", Toast.LENGTH_SHORT).show();
                mp = MediaPlayer.create(this, R.raw.ilivein);
                mp.start();
                break;
        }
    }
    
    private void stopPlaying() {
                if (mp != null) {
                    mp.stop();
                    mp.release();
                    mp = null;
               }
            }