我正在尝试使用android.graphics.Movie
播放来自/sdcard/download
的GIF文件。
如果我将文件放在APK的drawable
文件夹中,我可以使用以下方式加载:
InputStream istr = context.getResources().openRawResource(R.drawable.animfile);
Movie movie = Movie.decodeStream(istr);
有效。 movie.duration()
将显示正确的持续时间,我用它来获取movie.setTime()
的值。
如果我尝试使用
从SD卡加载,而不是drawable,则会出现问题String path = Environment.getExternalStorageDirectory() + "/download/animfile.gif";
Movie movie = Movie.decodeFile(path);
似乎加载某些内容,因为movie
不为空。但问题是movie.duration()
会返回0
。
知道为什么会这样,以及我应该做什么?
答案 0 :(得分:3)
我也碰到了这个。经过多次试验和错误后,我使用getContentResolver()。openInputStream和android BitmapDecode example中的dead streamToBytes代码使其工作,这似乎有效。我还没有找到解释为什么需要对包资源和sd文件进行不同的处理。
示例:
...
Uri uri = Uri.parse(uriString);
java.io.InputStream is;
try {
is = context.getContentResolver().openInputStream(uri);
}
catch(Exception e) {
}
byte[] array = streamToBytes(is);
Movie movie = Movie.decodeByteArray(array, 0, array.length);
private static byte[] streamToBytes(InputStream is) {
ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int len;
try {
while ((len = is.read(buffer)) >= 0) {
os.write(buffer, 0, len);
}
} catch (java.io.IOException e) {
}
return os.toByteArray();
}
答案 1 :(得分:2)
你是对的,除了一个。您不应该使用Uri和ContentResolver。简短的解决方案是你应该使用
Movie.decodeByteArray(array, 0, array.length)
而不是
Movie.decodeFile(path);
线索是在decodeFile(path)方法中创建的某些流的reset()方法实现。
答案 2 :(得分:1)
is = new FileInputStream(file path);
if (path != null) {
try {
byte[] array = streamToBytes(is);
mMovie = Movie.decodeByteArray(array, 0, array.length);
mDuration = mMovie.duration();
Log.v("total time ", mDuration + "");
} finally {
is.close();
}
} else {
throw new IOException("Unable to open R.raw.");
}
private byte[] streamToBytes(InputStream is) {
ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int len;
try {
while ((len = is.read(buffer)) >= 0) {
os.write(buffer, 0, len);
}
} catch (java.io.IOException e) {
}
return os.toByteArray();
}