按几次按钮后音频崩溃

Audio crashes after pressing the buttons a few times

我在 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>

可能是一次打开的媒体播放器太多。所以像这样尝试

创建一个全局 MediaPlayer 对象如下

MediaPlayer mediaPlayer = MediaPlayer.create(cotext, null);

然后为每个 case 添加下面的代码和相应的 res id

AssetFileDescriptor afd = MainActivity.this.getResources().openRawResource(R.raw.livein)
mediaPlayer.setDataSource(afd);
mediaPlayer.start();

您应该只使用一个 MediaPlayer 对象并在 initiating/playing 新媒体文件之前停止之前的调用。这是修改后的代码,可能会有帮助 -

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