按下按钮几次后音频崩溃

时间:2017-02-05 04:12:46

标签: android android-mediaplayer

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

2 个答案:

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