所以,我正在制作一款带有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访问音频文件的其他任何方式?
(请记住,我的目标是在每个不同选项卡的屏幕中播放不同的音频文件。我稍后会添加更多音频文件,只是尝试至少使用这个文件。)
请帮助:)
谢谢!
答案 0 :(得分:8)
您需要使用Context对象,因此在此示例中您可以使用:
rootView.getContext().getAssets().openFd("a.mp3");
那就是说,我建议在实例化视图层次结构后,在onActivityCreated
或onStart
中的片段生命周期中移动此代码。将此代码放在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");