2

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

下面是我的片段的 OnCreateView,包含媒体播放器的初始化、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 访问音频文件的任何其他方式?

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

请帮助:)

谢谢 !

4

3 回答 3

8

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

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

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

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

于 2013-08-13T13:00:35.493 回答
0

只需将 getAssets() 替换为 context.getAssets() :)

于 2013-08-13T12:58:03.397 回答
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");

或者

fda = myUtil.getMyAssets(rootView.getContext()).openFd("a.mp3");
于 2016-03-07T23:35:48.777 回答