2011-05-15 16 views
5

/sdcard/download'dan bir GIF dosyasını oynatmak için android.graphics.Movie kullanmayı deniyorum. Ben APK'nızdaki drawable klasöre koyarsanızAndroid - Film sınıfını kullanarak gif dosyasını yüklenemedi

, ben kullanarak yükleyebilirsiniz: çalışır

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

. movie.duration(), movie.setTime() için değeri türetmek için kullandığım doğru süreyi gösterecektir. yerine çekilebilir, ben

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

O movie olarak boş değil şey yüklemek gibi görünüyor kullanarak sd-kart yüklemek deneyin, eğer

sorun olmuyor. Ancak sorun, movie.duration()'un 0 döndürmesidir.

Bunun neden olduğu ve ne yapmam gerektiği hakkında bir fikriniz var mı? Bunlara da rastladım

cevap

3

Çok fazla deneme ve hatadan sonra çalışmayı göze çarpan android BitmapDecode example'daki getContentResolver(). OpenInputStream ve dead streamToBytes kodunu kullanarak çalıştım. Paket kaynakları ve sd dosyaları için bunun neden farklı şekilde yapılması gerektiğine ilişkin bir açıklamaya rastlamadım.

örnek:

... 
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(); 
} 
2

Bir biri hariç, haklısın. Uri ve ContentResolver kullanmamalısınız. Kısa çözümü

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

yerine ipucu decodeFile (yol) yöntemi içinde oluşturulan bazı akışın sıfırlama() yöntemi uygulamasında olduğu

Movie.decodeFile(path); 

kullanımı gerektiğidir.

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(); 
      } 
İlgili konular