无法对非静态方法getAssets()进行静态引用 - 无法在片段中播放音频

时间:2013-08-13 12:51:52

标签: android audio static fragment

所以,我正在制作一款带有Scrollable Tabs + Swipe导航的应用程序。 在每个标签页面中,我想播放不同的音频文件。

下面是我的片段的OnCreateView,其中包含mediaplayer的初始化,FileDescriptor以及在assets文件夹中播放名为a.mp3的音频文件。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main_dummy,
                container, false);


        ///Playing sound from here on 
             AssetFileDescriptor fda;
        MediaPlayer amp = new MediaPlayer();
        try {

            fda = getAssets().openFd("a.mp3");//// GIVES ERROR !
            amp.reset();
            amp.setDataSource(fda.getFileDescriptor());
            amp.prepare();
            amp.start();

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return rootView;

    }
}

GetAssets()方法给出如下错误:

Cannot make a static reference to the non-static method getAssets() from the type ContextWrapper

虽然从声明FileDescriptor到最终Catch语句的同一段代码在普通空白活动的OnCreate中完美地运行。它不在这里工作。

任何解决方案吗?

我可以以某种方式使getAssets()方法保持静态吗?

从Fragment访问音频文件的其他任何方式?

(请记住,我的目标是在每个不同选项卡的屏幕中播放不同的音频文件。我稍后会添加更多音频文件,只是尝试至少使用这个文件。)

请帮助:)

谢谢!

3 个答案:

答案 0 :(得分:8)

您需要使用Context对象,因此在此示例中您可以使用:

rootView.getContext().getAssets().openFd("a.mp3");

那就是说,我建议在实例化视图层次结构后,在onActivityCreatedonStart中的片段生命周期中移动此代码。将此代码放在onCreateView中可能会延迟/减慢向用户显示UI。

从以后的生命周期方法中,您可以安全地调用:  getResources().getAssets().openFd("a.mp3");

答案 1 :(得分:0)

只需用context.getAssets()替换getAssets():)

答案 2 :(得分:0)

您可以在实用程序类中指定以下2方法。他们会为您返回AssetManager

public static AssetManager getMyAssets(Context context)
{
     return context.getResources().getAssets();
}

public static AssetManager getMyAssets(View view)
{
     return view.getContext().getResources().getAssets();
}

现在您可以像这样使用它们:

fda = myUtil.getMyAssets(rootView).openFd("a.mp3");

OR

fda = myUtil.getMyAssets(rootView.getContext()).openFd("a.mp3");