2012-08-02 3 views
5

Ich versuche eine Videodatei herunterzuladen und dann in einer App abzuspielen, wenn ich die Videodatei in den Ordner res aufnehme, kann ich sie ohne Probleme abspielen , aber wenn ich versuche, das Video herunterzuladen, dann spiele ich den VideoView Error: 1, -2147483648.Abspielen eines heruntergeladenen Videos Fehler: 1, -2147483648

Dies ist der Code verwende ich das Video herunterladen:

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

Dies scheint erfolgreich abgeschlossen, aber wenn ich versuche, die Datei mit dem gefolgt Code zu spielen, habe ich den Fehler.

// 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(); 

Wie im Code zu sehen, bevor ich überprüfen, ob die Datei vorhanden ist und spielen auch vermute, es ist eine Größe (es die gleiche Größe wie die heruntergeladene Datei ist), aber es wird nicht spielen, ich bin die Datei verdorben, aber ich weiß nicht warum.

Ich habe folgende Berechtigungen im Manifest

<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

Ich habe genau das gleiche Problem. Irgendeine Antwort ? –

+1

können Sie Ihren kompletten StackTrace veröffentlichen? Haben Sie auch (wie bei einer Prüfsumme und Größe oder etwas) überprüft, dass Ihre Datei gültig ist (es könnte etwas mit dem Download-Teil nicht stimmen)? – njzk2

+0

Das Herunterladen einer großen Datei erfordert wahrscheinlich eine robustere Methode, wie das Herunterladen in Chunks. – mparaz

Antwort

0

Es hat mir einmal passiert ist, das Problem mit den Berechtigungen war. Was Sie tun müssen, wenn Sie eine Datei herunterladen, müssen Sie ihr Lese-/Schreibberechtigungen geben. So nach dem Download der Datei fügen Sie diese Zeilen und versuchen:

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

Nur eine Frage, warum Sie nicht die URL zum Video übergeben direkt an den Videoview? Normalerweise alle Beispiele, die Sie im Web sehen wie folgt vorgehen:

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

Wo „mContext“ in Ihrem Anwendungskontext und „this.Url“ ist die URL, die Sie in der Videoview laden müssen.

0

Wie ich es verstehe, ist dies ein Problem mit Berechtigungen. Die Datei muss weltweit lesbar sein, aber ich nehme an, Sie wollen den Benutzer nicht zwingen, sein Telefon zu rooten, um den richtigen Linux-Befehl ausführen zu können.

, dass Sie mit zwei Optionen lässt:

  1. Da die Anwendung die Datei besitzt, können Sie eine FileDescriptor verwenden, um die Datei

    Fileinputfileinput = new Fileinputstream zu öffnen ("/ data/data/com.mypackage/myfile "); mediaPlayer.setDataSource (DateiInputStream.getFD());

    Da Sie jedoch keinen MediaPlayer verwenden, ist das keine Option.

  2. Legen Sie die Berechtigung beim Abrufen der Datei fest.

    String basedir = ("/data/data/com.companyname.appname/files/videos/videoFilename.mp4"); Datei file = this.ctx.getDir (basedir, Context.MODE_WORLD_READABLE);

Hoffe es hilft! Prost.

1

In meinem Fall lag der Fehler daran, dass der Mediaplayer keine Dateiberechtigungen für das lokal gespeicherte Video hatte. Versuchen Sie, das Video auf dem externen Speicher zu speichern.