5

android.graphics.MovieからGIFファイルを再生するために使用しようとしています/sdcard/download

APKのフォルダーにファイルを配置すると、次のコマンドを使用してファイルdrawableを読み込むことができます。

InputStream istr = context.getResources().openRawResource(R.drawable.animfile);
Movie movie = Movie.decodeStream(istr);

それはうまくいきます。movie.duration()の値を導出するために使用する正しい期間が表示されmovie.setTime()ます。

ドローアブルの代わりに、SDカードからロードしようとすると問題が発生します

String path = Environment.getExternalStorageDirectory() + "/download/animfile.gif";
Movie movie = Movie.decodeFile(path);

nullではないものをロードしているようです。movieしかし、問題はそれmovie.duration()が戻ること0です。

なぜこれが起こるのか、そして私が何をすべきかについて何か考えはありますか?

4

3 に答える 3

3

私もこれに遭遇しました。多くの試行錯誤の後、getContentResolver().openInputStream と Android BitmapDecode exampleのデッド 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();
}
于 2011-08-17T17:01:28.500 に答える
2

1つを除いて、あなたは正しいです。Uri と ContentResolver は使用しないでください。短い解決策は、使用する必要があることです

Movie.decodeByteArray(array, 0, array.length)

それ以外の

Movie.decodeFile(path);

手がかりは、decodeFile(path) メソッド内で作成されたストリームの reset() メソッド実装にあります。

于 2011-09-01T03:15:54.660 に答える
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();
            }
于 2012-08-21T10:37:20.943 に答える