2011-05-15 11 views
5

का उपयोग कर gif फ़ाइल लोड करने में विफलता /sdcard/download से एक GIF फ़ाइल चलाने के लिए मैं android.graphics.Movie का उपयोग करने का प्रयास कर रहा हूं।एंड्रॉइड - मूवी क्लास

अगर मैं APK में drawable फ़ोल्डर में फ़ाइल डाल, मैं इसे का उपयोग कर लोड कर सकते हैं:

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

काम करता है। movie.duration() सही अवधि दिखाएगा, जिसका उपयोग मैं movie.setTime() के मान को प्राप्त करने के लिए करता हूं।

समस्या होता है अगर, drawable के बजाय, मैं का उपयोग कर

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

यह कुछmovie के रूप में रिक्त नहीं है लोड करने के लिए लगता है एसडी कार्ड से लोड करने के लिए प्रयास करें। लेकिन समस्या यह है कि movie.duration()0 देता है।

कोई विचार क्यों ऐसा होता है, और मुझे क्या करना चाहिए?

उत्तर

3

मैं भी इसमें भाग गया। अधिक परीक्षण और त्रुटि के बाद मुझे getContentResolver()। OpenInputStream और एंड्रॉइड BitmapDecode example में मृत स्ट्रीम टॉइट्स कोड का उपयोग करके काम करने के लिए मिला, जो काम करता है। मैं अभी तक एक स्पष्टीकरण में नहीं आया हूं कि पैकेज संसाधनों और एसडी फाइलों के लिए इसे अलग-अलग क्यों किया जाना चाहिए।

उदाहरण:

... 
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

आप ठीक कह रहे हैं, एक एक को छोड़कर। आपको उरी और कंटेंट रीसोल्वर का उपयोग नहीं करना चाहिए। लघु समाधान है कि आप

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

बजाय

Movie.decodeFile(path); 

सुराग रीसेट() कुछ धारा है कि decodeFile (पथ) विधि के अंदर बनाई गई की विधि कार्यान्वयन में है का उपयोग करना चाहिए है।

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(); 
      } 
संबंधित मुद्दे