SoundPool 加载失败

Posted

技术标签:

【中文标题】SoundPool 加载失败【英文标题】:SoundPool loading failing 【发布时间】:2021-09-16 07:17:28 【问题描述】:

这是我的第一个 android 应用。 Java 对我来说是新的。

我正在尝试使用 SoundPool,但没有加载声音文件。在片段中的Button.setOnClickListener 方法中,尝试播放声音片段,但不起作用。

我通过浏览包括本网站在内的互联网对此问题进行了一些研究。无法获得正确的失败原因和修复方法。

我的代码如下:

public class LauncherFragment extends Fragment 

    private FragmentLauncherBinding binding;

    SoundPool soundPool;
    int launcher ;


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

        binding = FragmentLauncherBinding.inflate(inflater, container, false);


        if (Build.VERSION.SDK_INT
                >= Build.VERSION_CODES.LOLLIPOP) 
            AudioAttributes
                    audioAttributes
                    = new AudioAttributes
                    .Builder()
                    .setUsage(
                            AudioAttributes
                                    .USAGE_ASSISTANCE_SONIFICATION)
                    .setContentType(
                            AudioAttributes
                                    .CONTENT_TYPE_SONIFICATION)
                    .build();
            soundPool
                    = new SoundPool
                    .Builder()
                    .setMaxStreams(3)
                    .setAudioAttributes(
                            audioAttributes)
                    .build();
        
        else 
            soundPool
                    = new SoundPool(
                    3,
                    AudioManager.STREAM_MUSIC,
                    0);
        


        try 
            launcher
                    = soundPool
                    .load(
                            getActivity().getApplicationContext(),
                            R.raw.soundbite_mpthree,
                            1);
        
        catch ( Exception e)
        
            Toast.makeText(LauncherFragment.this.getContext(), "Load failed", Toast.LENGTH_SHORT).show();
        

        return binding.getRoot();

    

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        binding.launcherButton.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                soundPool.play(
                        launcher, 1, 1, 0, 0, 1);
                soundPool.autoPause();

                NavHostFragment.findNavController(LauncherFragment.this)
                        .navigate(R.id.action_LauncherFragment_to_ActionFragment);
            
        );
    

在调试过程中,我发现 launcher 的值为 1,并且调试器控制台显示“E/SoundPool:无法加载样本:(null)”。

请让我知道我的代码在哪里出错并进行修复。提前致谢。

【问题讨论】:

我将 audioAttributes .USAGE_ASSISTANCE_SONIFICATION 更改为 '.USAGE_MEDIA`。然后使用大小小于 40KB 的 mp3 文件代替 ogg 文件。当我运行调试器时,soundPool 工作但实际运行它不会。是不是因为下一个代码语句正在导航到另一个片段。如何解决这个问题?谢谢。 【参考方案1】:

我找到的解决方案是对代码进行以下更改。

    .USAGE_ASSISTANCE_SONIFICATION to '.USAGE_MEDIA 更改 audioAttributes。 使用小于 40 KB 的短 mp3 文件代替 ogg 文件 使用handler.post(new Runnable() //code to play sound handler.postDelayed(); to introduce some delay for soundpool to complete its job ); 我不知道解决方案 1 和 2 如何解决加载声音文件。但它奏效了。

【讨论】:

以上是关于SoundPool 加载失败的主要内容,如果未能解决你的问题,请参考以下文章

SoundPool.load() 是不是设计为异步加载?

Android - 使用变量加载到 SoundPool。

如何在 soundPool (Android) 中逐渐加载声音?

加载文件时Android Soundpool错误

SoundPool 加载缓慢,MotionEvent 很奇怪

从资产加载和播放 soundpool