2012-08-02 33 views
5

मैं एक वीडियो फ़ाइल डाउनलोड करने की कोशिश कर रहा हूं और फिर इसे ऐप में चला रहा हूं, अगर मैं वीडियो फ़ाइल को res फ़ोल्डर में डालता हूं तो मैं बिना किसी समस्या के इसे चलाने में सक्षम हूं हालांकि, जब मैं वीडियो को आजमाकर डाउनलोड करता हूं तो इसे चलाता हूं मुझे वीडियोव्यू त्रुटि मिलती है: 1, -2147483648।डाउनलोड किए गए वीडियो को चलाने में त्रुटि: 1, -2147483648

try 
    { 

     URL url = new URL(videoURL); 
     URLConnection conexion = url.openConnection(); 
     conexion.connect(); 

     int lengthOfFile = conexion.getContentLength(); 
     Log.d("ANDRO_ASYNC", "Length of file: " + lengthOfFile); 

     InputStream input = new BufferedInputStream(url.openStream()); 




     final File dir = new File(this.getFilesDir() + "/videos"); 
     dir.mkdirs(); //create folders where write files 
     final File file = new File(dir, "my_video.mp4"); 

     Log.d("writePath", file.getPath()); 

     FileOutputStream output = new FileOutputStream(file); 

     byte data[] = new byte[1024]; 
     long total = 0; 

     while((count = input.read(data)) != -1) 
     { 
      total += count; 
      //publishProgress("" + (int)((total*100)/lengthOfFile)); 
      output.write(data, 0, count); 
     } 

     output.flush(); 
     output.close(); 
     input.close(); 

     Log.d("download", "finished"); 

    } 
    catch(Exception e) 
    { 

     Log.d("Exception", e.getMessage()); 
    } 

यह सफलतापूर्वक पूर्ण करने के लिए प्रकट होता है, लेकिन जब मैं पीछा किया कोड के साथ फ़ाइल को चलाने का प्रयास, मैं त्रुटि मिलती है:

इस कोड मैं वीडियो डाउनलोड करने के लिए इस्तेमाल करते हैं।

// Play Video 
    videoView = (VideoView)findViewById(R.id.surface_view); 
    // 

    File f = new File("/data/data/com.companyname.appname/files/videos/videoFilename.mp4"); 



    if(f.exists()) 
    { 
     long len = f.length(); 
     String length = String.valueOf(len); 
     Log.d("file", "exists"); 
     Log.d("length", (String)length); 
    } 
    else 
    { 
     Log.d("file", "does not exist"); 
    } 

    // 






    videoView.setMediaController(new MediaController(this)); 


    videoView.setVideoPath(f.getPath()); 
    videoView.start(); 

के रूप में, कोड में देखा खेलने मैं जाँच लें कि फ़ाइल मौजूद है और यह भी आकार से पहले (यह डाउनलोड की गई फ़ाइल के रूप में एक ही आकार है), लेकिन यह नहीं खेलेंगे, मेरा अनुमान है कि फाइल है दूषित लेकिन मुझे नहीं पता क्यों।

मैं निम्न अनुमतियों प्रकट

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

मुझे एक ही समस्या मिली। कोई उत्तर ? –

+1

क्या आप अपना पूरा स्टैकट्रैक पोस्ट कर सकते हैं? भी, क्या आपने चेक किया था (चेकसम और आकार या कुछ के साथ) कि आपकी फ़ाइल मान्य है (डाउनलोड भाग में कुछ गड़बड़ हो सकती है)? – njzk2

+0

एक बड़ी फ़ाइल डाउनलोड करने के लिए शायद अधिक मजबूत विधि की आवश्यकता होती है, जैसे कि भाग में डाउनलोड करना। – mparaz

उत्तर

0

यह मेरे लिए एक बार हुआ में सेट, समस्या अनुमतियों के साथ था। फ़ाइल डाउनलोड करते समय आपको क्या करना है, आपको इसे पढ़ने/लिखने की अनुमति देना है। तो फ़ाइल डाउनलोड करने के बाद, इन पंक्तियों को जोड़ने और कोशिश:

      file.setExecutable(true, false); 
          file.setReadable(true, false); 
          file.setWritable(true, false); 
0

बस एक सवाल है, तुम क्यों यूआरएल वीडियो के लिए सीधे VideoView के पास नहीं है? आम तौर पर सारे उदाहरण आपको वेब पर दिखाई ऐसा करते हैं:

VideoView video = new VideoView(mContext); 
video.setMediaController(new MediaController(mContext)); 
video.setVideoURI(Uri.parse(this.url)); 

"mContext" आपके आवेदन के संदर्भ में और कहाँ "this.url" यूआरएल आप VideoView में लोड करने के लिए की जरूरत है।

0

जैसा कि मैं समझता हूं कि यह एक अनुमति समस्या है। फ़ाइल को दुनिया को पढ़ने योग्य होना चाहिए, लेकिन मुझे लगता है कि आप उपयोगकर्ता को उचित फोनक्स कमांड चलाने में सक्षम होने के लिए अपने फोन को रूट करने के लिए मजबूर नहीं करना चाहते हैं।

कि आपके पास दो विकल्प के साथ छोड़ देता है:

  1. के बाद से आवेदन फाइल का मालिक है, तो आप फ़ाइल

    FileInputStream fileInputStream = नए FileInputStream खोलने के लिए एक FileDescriptor उपयोग कर सकते हैं ("/ डेटा/डेटा/com.mypackage/myFile "); mediaPlayer.setDataSource (fileInputStream.getFD());

    लेकिन चूंकि आप MediaPlayer का उपयोग नहीं करते हैं, मुझे लगता है कि यह एक विकल्प नहीं है।

  2. फ़ाइल प्राप्त करते समय अनुमति सेट करें।

    स्ट्रिंग आधारित = ("/data/data/com.companyname.appname/files/videos/videoFilename.mp4"); फ़ाइल फ़ाइल = this.ctx.getDir (आधारित, Context.MODE_WORLD_READABLE);

उम्मीद है कि यह मदद करता है! चीयर्स।

1

मेरे मामले में त्रुटि मध्यस्थ के कारण स्थानीय रूप से संग्रहीत वीडियो पर फ़ाइल अनुमति नहीं थी। वीडियो को बाहरी भंडारण पर संग्रहीत करने का प्रयास करें।

संबंधित मुद्दे