ANDROID: ¿Cómo descargo un archivo de video a la tarjeta SD?

Tengo un archivo de video en un sitio web en formato .MP4 y quiero permitir que el usuario pueda descargar el video a su tarjeta SD haciendo clic en un enlace. Hay una forma fácil de hacer esto. Actualmente tengo este código pero no funciona … no estoy seguro de lo que estoy haciendo mal. ¡Gracias por cualquier ayuda!

import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.apache.http.util.ByteArrayBuffer; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class VideoManager extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);} private final String PATH = "/sdcard/download/"; //put the downloaded file here public void DownloadFromUrl(String VideoURL, String fileName) { //this is the downloader method try { URL url = new URL("http://www.ericmoyer.com/episode1.mp4"); //you can write here any link File file = new File(fileName); long startTime = System.currentTimeMillis(); Log.d("VideoManager", "download begining"); Log.d("VideoManager", "download url:" + url); Log.d("VideoManager", "downloaded file name:" + fileName); /* Open a connection to that URL. */ URLConnection ucon = url.openConnection(); /* * Define InputStreams to read from the URLConnection. */ InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); /* * Read bytes to the Buffer until there is nothing more to read(-1). */ ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } /* Convert the Bytes read to a String. */ FileOutputStream fos = new FileOutputStream(PATH+file); fos.write(baf.toByteArray()); fos.close(); Log.d("VideoManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec"); } catch (IOException e) { Log.d("VideoManager", "Error: " + e); } } } 

no se está quedando sin memoria? Me imagino que un archivo de video es muy grande, que está almacenando en el búfer antes de escribir en el archivo.

Sé que tu código de ejemplo está en Internet, ¡pero es MALO para descargar! Utilizar esta:

 private final int TIMEOUT_CONNECTION = 5000;//5sec private final int TIMEOUT_SOCKET = 30000;//30sec URL url = new URL(imageURL); long startTime = System.currentTimeMillis(); Log.i(TAG, "image download beginning: "+imageURL); //Open a connection to that URL. URLConnection ucon = url.openConnection(); //this timeout affects how long it takes for the app to realize there's a connection problem ucon.setReadTimeout(TIMEOUT_CONNECTION); ucon.setConnectTimeout(TIMEOUT_SOCKET); //Define InputStreams to read from the URLConnection. // uses 3KB download buffer InputStream is = ucon.getInputStream(); BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5); FileOutputStream outStream = new FileOutputStream(file); byte[] buff = new byte[5 * 1024]; //Read bytes (and store them) until there is nothing more to read(-1) int len; while ((len = inStream.read(buff)) != -1) { outStream.write(buff,0,len); } //clean up outStream.flush(); outStream.close(); inStream.close(); Log.i(TAG, "download completed in " + ((System.currentTimeMillis() - startTime) / 1000) + " sec");5 

Nunca conecte un camino, particularmente a un almacenamiento externo. Tu camino está mal en muchos dispositivos. Use Environment.getExternalStoragePath() para obtener la raíz del almacenamiento externo (que puede ser /sdcard o /mnt/sdcard u otra cosa).

Asegúrese de crear su subdirectorio, utilizando el objeto File que obtiene de Environment.getExternalStoragePath() .

Y, finalmente, no solo diga “pero no está funcionando”. No tenemos idea de qué significa “pero no funciona” en su caso. Sin esa información, es muy difícil ayudarte.