Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android descargar problemas de archivo binario

Tengo problemas para descargar un archivo binario (video) en mi aplicación desde Internet. En QuickTime, si lo descargo directamente funciona bien, pero a través de mi aplicación de alguna manera se pone en mal estado (aunque parezcan exactamente lo mismo en un editor de texto). He aquí un ejemplo:

URL u = new URL("http://www.path.to/a.mp4?video"); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); FileOutputStream f = new FileOutputStream(new File(root,"Video.mp4")); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ( (len1 = in.read(buffer)) > 0 ) { f.write(buffer); } f.close(); 

  • Cancelar En la suscripción de facturación de aplicaciones en android
  • Android: remove () Fragmento -> add () nuevo Fragmento de la misma clase otra vez -> onCreateView y onActivityCreated no llamado?
  • Kotlin kapt y componentes de arquitectura android fallan
  • onPrepareOptionsMenu no se llama en Fragmentos
  • Weka modelo de error de lectura en android
  • ¿Cómo debo manejar los tiempos de espera del servidor y las respuestas de código de error a una entrada de http en la aplicación para Android?
  • Android ImageView no está mostrando la imagen?
  • Java.util.ConcurrentModificationException en las pruebas de JUnit
  • 6 Solutions collect form web for “Android descargar problemas de archivo binario”

    No sé si es el único problema, pero tienes un fallo clásico de Java ahí: No estás contando con el hecho de que read () siempre permite devolver menos bytes de los que pides. Por lo tanto, su lectura podría obtener menos de 1024 bytes, pero su escritura siempre escribe exactamente 1024 bytes posiblemente incluyendo bytes de la iteración de bucle anterior.

    Correcto con:

      while ( (len1 = in.read(buffer)) > 0 ) { f.write(buffer,0, len1); } 

    Tal vez la mayor latencia de red o tamaños de paquetes más pequeños de 3G en Android están exacerbando el efecto?

     new DefaultHttpClient().execute(new HttpGet("http://www.path.to/a.mp4?video")) .getEntity().writeTo( new FileOutputStream(new File(root,"Video.mp4"))); 

    Un problema es la lectura del buffer. Si cada lectura del flujo de entrada no es un múltiplo exacto de 1024, se copiarán los datos incorrectos. Utilizar:

     byte[] buffer = new byte[1024]; int len1 = 0; while ( (len1 = in.read(buffer)) != -1 ) { f.write(buffer,0, len1); } 
      public class download extends Activity { private static String fileName = "file.3gp"; private static final String MY_URL = "Your download url goes here"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { URL url = new URL(MY_URL); HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); String PATH = Environment.getExternalStorageDirectory() + "/download/"; Log.d("Abhan", "PATH: " + PATH); File file = new File(PATH); if(!file.exists()) { file.mkdirs(); } File outputFile = new File(file, fileName); FileOutputStream fos = new FileOutputStream(outputFile); InputStream is = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ((len1 = is.read(buffer)) != -1) { fos.write(buffer, 0, len1); } fos.flush(); fos.close(); is.close(); } catch (IOException e) { Log.e("Abhan", "Error: " + e); } Log.i("Abhan", "Check Your File."); } } 

    Fije el código basado en comentarios anteriores en este hilo. He probado usando eclipse y varios archivos grandes. Está funcionando bien. Sólo tiene que copiar y pegar esto en su entorno y cambiar la ruta http y la ubicación que le gustaría que el archivo para ser descargado.

     try { //this is the file you want to download from the remote server String path ="http://localhost:8080/somefile.zip"; //this is the name of the local file you will create String targetFileName boolean eof = false; URL u = new URL(path); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); FileOutputStream f = new FileOutputStream(new File("c:\\junk\\"+targetFileName)); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ( (len1 = in.read(buffer)) > 0 ) { f.write(buffer,0, len1); } f.close(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

    Buena suerte Alireza Aghamohammadi

    Sólo utilizar el método de copia de Apache ( Apache Commons IO ) – la ventaja de usar Java!

     IOUtils.copy(is, os); 

    No olvide cerrar los flujos en un bloque final:

     try{ ... } finally { IOUtils.closeQuietly(is); IOUtils.closeQuietly(os); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.