SoundPool:样品1不准备

时间:2015-12-17 00:22:34

标签: android

当我在片段onCreateView,onStart或onResume应用程序中调用它时,SoundPool的问题会变慢。

当我按下按钮尝试获取ID时,声音不会出现Logcat写的“SoundPool:sample 1 not READY”

请帮帮我,有什么想法吗?谢谢!

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment_carnivore, container, false);

        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

            Sound.createOldSoundPool();
        } else {
            Sound.createNewSoundPool();
        }



        mAlligatorSound = Sound.loadSound(getContext(),"alligator.wav");
        mBatSound = Sound.loadSound(getContext(), "bat.mp3");
        mBearSound = Sound.loadSound(getContext(),"bear.wav");
        mBobcatSound=Sound.loadSound(getContext(),"bobcat.mp3");
        mCatSound=  Sound.loadSound(getContext(),"cat.wav");
        mCheetahSound=  Sound.loadSound(getContext(),"cheetah.wav");
        mCoyoteSound=  Sound.loadSound(getContext(),"coyote.wav");
        mCrocodileSound=  Sound.loadSound(getContext(),"crocodile.wav");
        mDogSound=  Sound.loadSound(getContext(),"dog.wav");
        mFoxSound=  Sound.loadSound(getContext(),"fox.mp3");
        mHyenaSound=  Sound.loadSound(getContext(),"hyena.wav");
        mJaguarSound=  Sound.loadSound(getContext(),"jaguar.wav");
        mKittenSound=  Sound.loadSound(getContext(),"kitten.wav");
        mLeopardSound=  Sound.loadSound(getContext(),"leopard.wav");
        mLionSound=  Sound.loadSound(getActivity(),"lion.wav");
        mPuppySound=  Sound.loadSound(getActivity(),"puppy.wav");
        mRattleSnakeSound=  Sound.loadSound(getActivity(),"rattlesnake.mp3");
        mSnakeSound=  Sound.loadSound(getActivity(),"snake.wav");
        mTigerSound=  Sound.loadSound(getActivity(),"tiger.wav");
        mWolfSound=  Sound.loadSound(getActivity(),"wolf.wav");

        int idList[]={R.id.imageButtonAlligator,R.id.imageButtonBat,R.id.imageButtonBear,R.id.imageButtonBobCat,R.id.imageButtonCat,
                      R.id.imageButtonCheetah,R.id.imageButtonCoyote,R.id.imageButtonCrocodile,R.id.imageButtonDog,R.id.imageButtonFox,
                      R.id.imageButtonHyena,R.id.imageButtonJaguar,R.id.imageButtonKitten,R.id.imageButtonLeopard,R.id.imageButtonLion,
                      R.id.imageButtonPuppy,R.id.imageButtonRattlesnake,R.id.imageButtonSnake,R.id.imageButtonTiger,R.id.imageButtonWolf};

        for (int id :idList){
            ImageButton imageButton = (ImageButton)view.findViewById(id);
            imageButton.setOnClickListener(onClickListener);
        }



        return view;
    }

    View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            switch (v.getId()) {
                case R.id.imageButtonAlligator:
                    Sound.playSound(mAlligatorSound);
                    Toast.makeText(view.getContext(),R.string.Alligator, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonBat:
                    Sound.playSound(mBatSound);
                    Toast.makeText(view.getContext(),R.string.Bat, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonBear:
                    Sound.playSound(mBearSound);
                    Toast.makeText(view.getContext(),R.string.Bear, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonBobCat:
                    Sound.playSound(mBobcatSound);
                    Toast.makeText(view.getContext(),R.string.BobCat, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonCat:
                    Sound.playSound(mCatSound);
                    Toast.makeText(view.getContext(),R.string.Cat, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonCheetah:
                    Sound.playSound(mCheetahSound);
                    Toast.makeText(view.getContext(),R.string.Cheetah, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonCoyote:
                    Sound.playSound(mCoyoteSound);
                    Toast.makeText(view.getContext(),R.string.Coyote, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonCrocodile:
                    Sound.playSound(mCrocodileSound);
                    Toast.makeText(view.getContext(),R.string.Crocodile, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonDog:
                    Sound.playSound(mDogSound);
                    Toast.makeText(view.getContext(),R.string.Dog, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonFox:
                    Sound.playSound(mFoxSound);
                    Toast.makeText(view.getContext(),R.string.Fox, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonHyena:
                    Sound.playSound(mHyenaSound);
                    Toast.makeText(view.getContext(),R.string.Hyena, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonJaguar:
                    Sound.playSound(mJaguarSound);
                    Toast.makeText(view.getContext(),R.string.Jaguar, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonKitten:
                    Sound.playSound(mKittenSound);
                    Toast.makeText(view.getContext(),R.string.Kitten, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonLeopard:
                    Sound.playSound(mLeopardSound);
                    Toast.makeText(view.getContext(),R.string.Leopard, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonLion:
                    Sound.playSound(mLionSound);
                    Toast.makeText(view.getContext(),R.string.Lion, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonPuppy:
                    Sound.playSound(mPuppySound);
                    Toast.makeText(view.getContext(),R.string.Puppy, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonRattlesnake:
                    Sound.playSound(mRattleSnakeSound);
                    Toast.makeText(view.getContext(),R.string.RattleSnake, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonSnake:
                    Sound.playSound(mSnakeSound);
                    Toast.makeText(view.getContext(),R.string.Snake, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonTiger:
                    Sound.playSound(mTigerSound);
                    Toast.makeText(view.getContext(),R.string.Tiger, Toast.LENGTH_SHORT).show();
                    break;
                case R.id.imageButtonWolf:
                    Sound.playSound(mWolfSound);
                    Toast.makeText(view.getContext(),R.string.Wolf, Toast.LENGTH_SHORT).show();
                    break;

            }

        }
    };

当方法被称为Sound.loadSound(...,...)时单击声音不起作用,并且Logcat写入“SoundPool:sample 1 not READY”

 switch (v.getId()) {
            case R.id.imageButtonAlligator:
                mAlligatorSound = Sound.loadSound(getContext(),"alligator.wav");
                Sound.playSound(mAlligatorSound);
                Toast.makeText(view.getContext(),R.string.Alligator, Toast.LENGTH_SHORT).show();
                break;
            case R.id.imageButtonBat:
                mBatSound = Sound.loadSound(getContext(), "bat.mp3");
                Sound.playSound(mBatSound);
                Toast.makeText(view.getContext(),R.string.Bat, Toast.LENGTH_SHORT).show();
                break;
            case R.id.imageButtonBear:
                mBearSound = Sound.loadSound(getContext(),"bear.wav");
                Sound.playSound(mBearSound);
                Toast.makeText(view.getContext(),R.string.Bear, Toast.LENGTH_SHORT).show();
                break;
            case R.id.imageButtonBobCat:
                mBobcatSound=Sound.loadSound(getContext(),"bobcat.mp3");
                Sound.playSound(mBobcatSound);
                Toast.makeText(view.getContext(),R.string.BobCat, Toast.LENGTH_SHORT).show();
                break;
            case R.id.imageButtonCat:
                mCatSound=  Sound.loadSound(getContext(),"cat.wav");
                Sound.playSound(mCatSound);
                Toast.makeText(view.getContext(),R.string.Cat, Toast.LENGTH_SHORT).show();
                break;

这是静态方法声音

public class Sound {

    public   static SoundPool mSoundPool;
    public   static AssetManager mAssetManager;
    public   static int mStreamID;


    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void createNewSoundPool() {
        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();
        mSoundPool = new SoundPool.Builder()
                .setAudioAttributes(attributes)
                .build();
    }

    @SuppressWarnings("deprecation")
    public static void createOldSoundPool() {
        mSoundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
    }

    public static int playSound(int sound) {
        if (sound > 0) {
            mStreamID = mSoundPool.play(sound, 1, 1, 1, 0, 1);
        }
        return mStreamID;
    }

    public static int loadSound(Context context , String fileName) {
        mAssetManager = context.getAssets();
        AssetFileDescriptor afd;
        try {
            afd = mAssetManager.openFd(fileName);
        } catch (IOException e) {
            e.printStackTrace();
              Toast.makeText(context, "Не могу загрузить файл " + fileName,
                    Toast.LENGTH_SHORT).show();
            return -1;
        }
        return mSoundPool.load(afd, 1);
    }


}

1 个答案:

答案 0 :(得分:1)

在对soundpool做任何事情之前,在实例化它之后,你需要设置一个监听器来知道它何时准备好使用,将声音加载到内存需要时间:这样做:

boolean loaded = false;//class variable
//in onCreate:
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                    int status) {
                loaded = true;
            }
        });

然后在使用soundPool之前,您需要检查Loaded是否为真 例如:

if (loaded) {
                soundPool.play(soundID, volume, volume, 1, 0, 1f);
                Log.e("Test", "Played sound");
            }