我正在使用Android 4.2,调用MediaExtractor.setDataSource时,有时会抛出“无法实例化提取器”的IOException。我已经找到了这个问题从C++实现中抛出的位置,但没有帮助。
其他遇到同样问题的人要么没有答案,要么得到的答案对我没有帮助:
android.media.MediaExtractor。有人让这个东西工作了吗?“无法实例化提取器”异常
在使用setDataSource()时无法实例化mediaextractor
为了拼命尝试解决这个问题,我编写了一个最小的演示应用程序:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean doStuff(View view) {
File f = getExternalFilesDir(null);
File[] files = f.listFiles();
for (File file : files) {
if (file.isFile()) {
Log.e("Andy", "trying file [" + file.getName() + "]");
startExtractor(file);
}
}
return true;
}
private void startExtractor(File f) {
MediaExtractor extractor = new MediaExtractor();
try {
extractor.setDataSource(f.getAbsolutePath());
} catch (IOException e) {
Log.e("Andy", "splat " + e.getMessage());
}
extractor.release();
}
}
这个应用程序的活动有一个单独的按钮,调用 "doStuff"。输出如下:
05-12 15:27:42.639: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:27:42.689: E/Andy(18757): splat Failed to instantiate extractor.
05-12 15:27:42.689: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:27:42.709: E/Andy(18757): trying file [test.mp4]
05-12 15:27:55.039: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:27:55.119: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:27:55.149: E/Andy(18757): trying file [test.mp4]
05-12 15:28:03.209: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:28:03.259: E/Andy(18757): splat Failed to instantiate extractor.
05-12 15:28:03.259: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:28:03.279: E/Andy(18757): trying file [test.mp4]
05-12 15:28:12.289: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:28:12.379: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:28:12.419: E/Andy(18757): trying file [test.mp4]
05-12 15:28:17.879: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:28:17.929: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:28:17.949: E/Andy(18757): splat Failed to instantiate extractor.
05-12 15:28:17.949: E/Andy(18757): trying file [test.mp4]
这让人感到困惑的几点是:
- 有时候它有效,有时候则无法运行
- 它在第一次尝试时就失败了。
现在,我相当确定其他人正在使用此界面并且它对他们有效,这意味着我使用的设备(MK808s)可能有损坏的固件,或者我错过了使其变得可靠的技巧。 有人有什么想法吗?
当GC启动时,logcat非常清晰,但GC时间与问题不相关。
编辑
我更改了按钮,以便启动一个线程,该线程循环1000次所有三个文件。 它一路畅通无阻。 很多人都感到困惑。 我发现如果我摆动鼠标而该线程正在运行,则它会开始失败,但是只要我松开鼠标,它就又开始工作了。 运行另一个仅进行一段时间的数学操作的线程则没有导致它。 在来自真实世界的应用程序中,删除鼠标并不能使问题消失,但这是一个大型应用程序,还会做很多其他事情。