soundPool或Mediaplayer提供简短的声音和帮助

时间:2014-09-01 06:02:07

标签: android audio

我创建了一个简单的应用程序,屏幕上几乎没有按钮。其中一个按钮叫做soundButton,当用户按下它时,将播放一个音频文件。 (例如,简单的单词,如" apple")。我有大约100个类似的屏幕,当我最初几次播放声音时,我可以听到声音,过了一会儿,无论我去哪个屏幕,我都无法再听到它们(甚至是前一个屏幕可以听到不再播放声音)这是我的编码,供参考:

package com.example.main;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class EngApple extends Activity{

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.eng_apple);

        ImageButton soundButton = (ImageButton) findViewById(R.id.sound);
        final MediaPlayer mp1 = MediaPlayer.create(this, R.drawable.apple);


        soundButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            mp1.start();
            }
        });
    }


}

这是一个闪存卡应用,声音非常短。我读到需要用来播放短音的方法是使用soundPool。所以我改变了我的代码但是徒劳无功。 (听起来没玩)任何人都可以帮我吗?谢谢

1 个答案:

答案 0 :(得分:1)

如果您确实按照上述模式进行了100多项活动,则表示每次启动新的“活动”屏幕时,您都会使用声音已加载来实例化MediaPlayer实例。我怀疑有些东西只是通过同时拥有那么多的MediaPlayer实例而得出的。鉴于您的声音全部都在资源中,您可以将.create电话推迟到.start()来电之前。

考虑使用一个单独的类来管理MediaPlayer的一个实例。如下所示:

import android.content.Context;
import android.media.MediaPlayer;

public class MediaPlayerWrapper
{
    static MediaPlayer _player;

    public static void play(Context context, int id)
    {
        stop();
        _player = MediaPlayer.create(context, id);
        _player.start();
    }

    public static void stop()
    {
        if (_player != null)
        {
            _player.reset();
            _player.release();
            _player = null;
        }
    }
}

然后你的onCreate方法就变成了:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.eng_apple);

    soundButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            MediaPlayerWrapper.play(EngApple.this, R.drawable.apple);
        }
    });