Android 将ZipFileProvider与MediaPlayer一起使用有时会导致非法状态异常

Android 将ZipFileProvider与MediaPlayer一起使用有时会导致非法状态异常,android,android-mediaplayer,apk-expansion-files,Android,Android Mediaplayer,Apk Expansion Files,我很难让MediaPlayer在android 4.3及更低版本上可靠地播放视频。大部分代码只是为了完整性而包含的标准样板文件 我使用的是APK扩展库,我的obb只是som缩略图和一些m4v视频文件的压缩包,还有一个用于描述视频的XML文件 我认为这是一个时间问题,因为错误似乎只发生在播放小文件时我能够通过使用AssetFileDescriptor而不是Uri来实现这一点 最终解决我问题的方法是: AssetFileDescriptor afd = expansionFile.getAssetF

我很难让MediaPlayer在android 4.3及更低版本上可靠地播放视频。大部分代码只是为了完整性而包含的标准样板文件

我使用的是APK扩展库,我的obb只是som缩略图和一些m4v视频文件的压缩包,还有一个用于描述视频的XML文件


我认为这是一个时间问题,因为错误似乎只发生在播放小文件时我能够通过使用AssetFileDescriptor而不是Uri来实现这一点

最终解决我问题的方法是:

AssetFileDescriptor afd = expansionFile.getAssetFileDescriptor(mFileName + ".m4v");
FileDescriptor fd = afd.getFileDescriptor();
long offset = afd.getStartOffset();
long length = afd.getLength();

try {
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setDataSource(fd,offset, length);
    mMediaPlayer.prepare();
...
} catch (IOException e) {
    e.printStackTrace();
} catch (IllegalStateException e) {
    e.printStackTrace();
}
我以前尝试过这种方法,但是没有偏移量和长度参数,这不起作用。你在上面看到的是它终于开始工作了

我以前的错误方法是使用ZipFileContentProvider,如下所示:

public final static String AUTHORITY = "com.example.app.provider.ZipFileContentProvider";
public final static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);

String videoFilePath = CONTENT_URI + "/" + mFileName + ".m4v";
Uri zipVideo = Uri.parse(videoFilePath);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(this, zipVideo);
mMediaPlayer.setDisplay(mHolder);
mMediaPlayer.prepare();

然而,正如原始问题中提到的那样,这只在某些特定的情况下起作用,这远远不够理想。

您能否将错误发布到LogCat上,这可能会有所帮助。我已经包含了LogCat的输出。
zip -rn .m4v:.png $ZIPFILE $XMLFILE $VIDEOSDIR $THUMBDIR
zipalign 4 $ZIPFILE $OBBFILE
AssetFileDescriptor afd = expansionFile.getAssetFileDescriptor(mFileName + ".m4v");
FileDescriptor fd = afd.getFileDescriptor();
long offset = afd.getStartOffset();
long length = afd.getLength();

try {
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setDataSource(fd,offset, length);
    mMediaPlayer.prepare();
...
} catch (IOException e) {
    e.printStackTrace();
} catch (IllegalStateException e) {
    e.printStackTrace();
}
public final static String AUTHORITY = "com.example.app.provider.ZipFileContentProvider";
public final static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);

String videoFilePath = CONTENT_URI + "/" + mFileName + ".m4v";
Uri zipVideo = Uri.parse(videoFilePath);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(this, zipVideo);
mMediaPlayer.setDisplay(mHolder);
mMediaPlayer.prepare();