2012-08-02 15 views
5

Estoy tratando de descargar un archivo de video y luego reproducirlo en una aplicación, si pongo el archivo de video en la carpeta res, puedo jugarlo sin problemas Sin embargo, cuando intento descargar el video y lo reproduzco, obtengo el error VideoView: 1, -2147483648.Reproducir un video descargado Error: 1, -2147483648

Este es el código que utilizo para descargar el video:

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

Esto parece realizarse correctamente, pero cuando trato de reproducir el archivo con el código seguido, me sale el error.

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

Como se ve en el código, antes de jugar puedo comprobar si el archivo existe y también su tamaño (que es del mismo tamaño que el archivo descargado) pero no va a jugar, que supongo es el archivo corrompido, pero no sé por qué.

I tienen los siguientes permisos establecidos en el manifiesto

<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

Tengo exactamente el mismo problema. Alguna respuesta ? –

+1

¿Puedes publicar tu stacktrace completo? también, ¿ha verificado (como con una suma de comprobación y tamaño o algo) que su archivo es válido (puede haber algo mal con la parte de descarga)? – njzk2

+0

La descarga de un archivo grande probablemente necesite un método más sólido, como descargar en trozos. – mparaz

Respuesta

0

Se me pasó una vez, el problema era con permisos. Lo que debe hacer al descargar un archivo, debe otorgarle permisos de lectura/escritura. Así que después de descargar el archivo, agregue estas líneas y tratar:

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

Sólo una pregunta, ¿por qué no se pasa la URL para el vídeo directamente a la VideoView? Normalmente todos los ejemplos que aparecen en la web hacen esto:

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

Donde "mContext" en su contexto de aplicación y "this.url" es la dirección URL tiene que cargar en el VideoView.

0

Según tengo entendido, este es un problema de permisos. El archivo debe ser legible en todo el mundo, pero supongo que no desea obligar al usuario a rootear su teléfono para poder ejecutar el comando de Linux correcto.

Eso te deja con dos opciones:

  1. Dado que la aplicación posee el archivo, se puede utilizar un FileDescriptor para abrir el archivo

    FileInputStream FileInputStream = new FileInputStream ("/ data/data/com.mypackage/myfile "); mediaPlayer.setDataSource (fileInputStream.getFD());

    Pero como no está utilizando un MediaPlayer, supongo que no es una opción.

  2. Establezca el permiso al obtener el archivo.

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

Hope it helps! Aclamaciones.

1

En mi caso, el error se debió a que el reproductor de medios no tenía permisos de archivo en el video almacenado localmente. Intente almacenar el video en el almacenamiento externo.

Cuestiones relacionadas