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