2012-04-20 22 views
6

मेरे पास एक ऐप है जो जीआईएफ छवियों को दिखाता है। यह सब ठीक काम करता है, तो छवि drawable में सहेजा गया है, और मैं इसे इसIOException - फ़ाइल लोड नहीं कर सकता

is=context.getResources().openRawResource(R.drawable.mygif); 
movie = Movie.decodeStream(is); 

तरह का उपयोग लेकिन मैं इंटरनेट से छवि डाउनलोड करने की आवश्यकता है, इसलिए मैं यह CacheDir लिए बचत कर रहा हूँ, कि ठीक काम करता है। मैंने इसे पढ़ने के लिए निम्नलिखित कोशिश की।

try 
    { 
     is = new BufferedInputStream(new FileInputStream(new File(context.getCacheDir(), "mygif.gif"))); 
    } 
    catch (FileNotFoundException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    movie = Movie.decodeStream(is); 

और यह

movie = Movie.decodeFile(new File(context.getCacheDir(), "mygif.gif").getPath()); 

लेकिन कोई बात नहीं क्या, यह

java.io.IOException 
at java.io.InputStream.reset(InputStream.java:218) 
at android.graphics.Movie.decodeStream(Native Method) 
at android.graphics.Movie.decodeTempStream(Movie.java:74) 
at android.graphics.Movie.decodeFile(Movie.java:59) 

या

java.io.IOException: Mark has been invalidated. 
at java.io.BufferedInputStream.reset(BufferedInputStream.java:350) 
at android.graphics.Movie.decodeStream(Native Method) 

साथ समाप्त होता है मुझे लगता है कि यह एक बहुत ही सरल त्रुटि है, लेकिन मैं यह कर सकते हैं इसे खत्म नहीं करें। प्रकट होते हैं:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
+0

आपको यह जांचना चाहिए कि डाउनलोड-एंड-सेव भाग फ़ाइल को दूषित कर रहा है या नहीं। ऐप फ़ाइल डाउनलोड करने के बाद, आप इसे 'adb pull 'का उपयोग करके एमुलेटर या डिवाइस से खींच सकते हैं। फिर आप जांच सकते हैं कि यह सर्वर पर क्या है। –

+0

मैंने इसे एमुलेटर से खींच लिया, और यह ठीक है। छवि 13kB है यदि यह किसी भी तरह से महत्वपूर्ण है –

+0

क्या आपने 'Movie.decodeFile (नई फ़ाइल (context.getCacheDir()," mygif.gif ") की कोशिश की है। GetAbsolutePath())'? –

उत्तर

13

सुझाव: sdcard अन्य फ़ोल्डर cache को छोड़कर, या एप्लिकेशन:

1.try डाउनलोड स्थान किसी अन्य फ़ोल्डर में की तरह चलते हैं।

2. जब inputstream init, उपयोग का प्रयास करें: एक बफर आकार के साथ init

int buffersize = 16*1024; 
InputStream is = new BufferedInputStream(xxx,buffersize); 

3.to जाँच फ़ाइल अपने फ़ोल्डर

अद्यतन में ही अस्तित्व में: इस तरह कोड बदल सकते हैं और न उपयोग Movie.decodeFile

InputStream is = null; 
    try { 
     is = new BufferedInputStream(new FileInputStream(new File(getCacheDir(), "mygif.gif")), 16 * 1024); 
     is.mark(16 * 1024); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
movie = Movie.decodeStream(is); 

कोई अपवाद नहीं फेंक, और movie अशक्त नहीं है।

इसके अलावा, हालांकि आपका कोड अपवाद फेंक देगा, movie भी शून्य नहीं है।

+0

1. कोई फर्क नहीं पड़ता; 2. कोई फर्क नहीं पड़ता; 3. यह मौजूद है और भ्रष्ट नहीं है –

+0

उत्तर अद्यतन करें, कृपया जांचें। – idiottiger

+0

धन्यवाद, नीचे दिया गया कोड नौकरी करता है! निशान() गायब था। बहुत बहुत धन्यवाद –

2

मैं जानता हूँ कि एक बहुत पुराने पोस्ट है, लेकिन मैं एक ही मुद्दा

हो रही थी एक बाइट सरणी InputStream प्रतिलिपि बनाई जा रही है और बुला Movie.decodeByteArray मेरे लिए काम किया, यहां तक ​​कि सैमसंग डिवाइस

0

पर मेरा जवाब है BeNeXuS के उत्तर के आधार पर।

फ़ाइल आकार हमेशा ज्ञात नहीं हो सकता, देखें:

File file = ...; 
InputStream inputStream = new FileInputStream(file); 

या

InputStream inputStream = getContext().getContentResolver().openInputStream(uri); 

InputStream मिलने के बाद: 4.4 अप करने के लिए

BufferedInputStream bis = new BufferedInputStream(inputStream); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

byte buffer[] = new byte[1024]; 
int len; 
while ((len = bis.read(buffer, 0, buffer.length)) > 0) { 
    baos.write(buffer, 0, len); 
} 
bis.close(); 

byte[] imageData = baos.toByteArray(); 
baos.close(); 

Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); 
0

Android फ़िल्म को डिकोड करने में विफल रहता है InputStream.reset() विधि में आंतरिक IOException के मामले में फ़ाइल और स्ट्रीम से। लेकिन बाइट्स से डीकोडिंग एंड्रॉइड के सभी संस्करणों पर अच्छी तरह से काम करता है।ऐसा करने के लिए कोड का काफी न्यूनतम संस्करण यहां दिया गया है:

int size = (int) imageFile.length(); 
byte[] buffer = new byte[size]; 
FileInputStream inputStream = new FileInputStream(imageFile); 
int readLength = inputStream.read(buffer); 
inputStream.close(); 
Movie movie = Movie.decodeByteArray(buffer, 0, readLength); 
संबंधित मुद्दे