我在4x2网格布局中有8个按钮,每个按钮都有一个随机英文单词或短语的文本。每个按钮播放一个非常短的音频文件,将单词或短语翻译成法语。
按下按钮几次后,所有按钮都停止工作了。应用程序再次运行的唯一方法是完全关闭模拟器并重新启动它。
这是Java代码:
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);
}
}
错误如下:
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)
我觉得它与不关闭某种资源有关,我想是音频文件。
我怀疑XML代码是否相关,但无论如何它仍然存在:
<?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>
答案 0 :(得分:1)
在启动/播放新媒体文件之前,您应该只使用一个MediaPlayer对象并停止之前的呼叫。这是一个可能有用的修订代码 -
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;
}
}
答案 1 :(得分:0)
这可能是因为一次打开的媒体播放器太多了。所以试试这个
创建一个全局MediaPlayer
对象,如下所示
MediaPlayer mediaPlayer = MediaPlayer.create(cotext, null);
然后为每个case
添加以下代码和相应的res id
AssetFileDescriptor afd = MainActivity.this.getResources().openRawResource(R.raw.livein)
mediaPlayer.setDataSource(afd);
mediaPlayer.start();