0 votos

Hola, no sé porque está pasando esto, estoy descargando unos archivos que tengo en Google Drive, y cuando descargo un archivo con un tamaño de 25 Mb no se descargar, se crear el archivo, pero con unos 2,21 Kb.
 
El código supongo que está bien, porque si descargo archivos de menor tamaño como de 20 Mb, no hay problemas, se descarga bien.
 
Este es uno de los códigos que estoy probando, aunque este código hace algo raro, el archivo se descargar dos veces, no sé porque, y luego acto seguido uno archivo se borra automáticamente:

// 20 Mb
 url = "https://drive.google.com/uc?export=download&id=1yg420M0KLshwALIlGpXToGgKE9nHFswc";
// 25 MB
// url = "https://drive.google.com/uc?export=download&id=1adnCSjflxYFpVaoEAZfQ3A1ZqGU_xFll";

 String FILENAME = "archivo.rar";
DownloadManager manager1 = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setTitle("Archivo");
request.setDescription("Descargando....");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationUri(Uri.parse("file://" + Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS) + "/" + FILENAME));
manager1.enqueue(request);

Objects.requireNonNull(manager1).enqueue(request);
if (DownloadManager.STATUS_SUCCESSFUL == 8) {
    Toast.makeText(getActivity(), "Archivo Descargado", Toast.LENGTH_LONG).show();
}

 

Este es otro código que también funciona, pero cuando se pone el link del archivos de 25 Mb ya no se descarga.

new DownloadFile().execute(url, "archivo.rar");

private class DownloadFile extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... strings) {
        String fileUrl = strings[0];   
        String fileName = strings[1];  
        String extStorageDirectory = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).toString();
        File folder = new File(extStorageDirectory, "testPDF");
        folder.mkdir();

        File pdfFile = new File(folder, fileName);

        try{
            pdfFile.createNewFile();
        }catch (IOException e){
            e.printStackTrace();
        }
        FileDownloader.downloadFile(fileUrl, pdfFile);
        return null;
    }

}

Tambien he probado con la librería PRDownloader https://github.com/MindorksOpenSource/PRDownloader 
y paso lo mismo, los archivos se descargan bien, pero al poner el enlace de un archivo de 20 Mb, ya solo se descargan unos 2,21 Kb.

Hay alguna limitación por algún lado, Por qué no me deja descargar archivos más grandes
 
Gracias.

por en Android

1 Respuesta

0 votos

La API de Google Drive puede que tenga algún limite al ser gratuito o que te esté pasando el sistema anti-DDOS. Puedes probar a descargar un fichero grande desde otra URL.

Podría ser una limitación de memoria del dispositivo también (quizás cambiando la ruta donde se guarda el fichero descargado).

También puedes probar con la manera tradicional de Java con "new BufferedInputStream(url.openStream()...". Tienes un ejemplo en (aunque es algo más complejo, pues requiere usar Buffers y AsyncTask): https://stackoverflow.com/questions/15758856/android-how-to-download-a-file-from-a-webserver

Por otro lado, si lo que quieres es ampliar la instalación, puedes añadir ficheros de expansión: https://developer.android.com/google/play/expansion-files

por
Hola Ramon, te voy respondiendo a lo que me preguntas, la ruta donde guardo el archivos he probado en la carpeta Descargas/Download y Documentos/Documents
 
El dispositivo que estoy utilizando es en el emulador de Android Studio, y tiene capacidad suficiente, he probado a copiar archivos del PC al emulador con mucho más peso y se han copiado sin problemas.

He probado a descargar el archivo de 100 Mb de la página donde están las pruebas de estos archivos,  https://win.pe/blog/descarga-archivos-de-prueba-gratis-y-mide-tu-internet/ y el archivo he visto que se ha descagardo, pero nada más descargase se ha borrado solo, no se porque, y ha sido a una de las dos carpetas Descargas o Documentos.

El enlace que me has puesta a stackoverflow, me temo que tendría el mismo resultado, porque el servidor web seguiría siendo Google Drive
  
Y es precisamente para eso, archivos OBB o de Expansión, quería subir ese archivos a Google Drive y luego copiarlo desde ahí, por qué a Google Drive, porque la aplicación que voy a intentar hacer, es para uso personal, y no voy a subirla a Google Play, por eso primero necesito ver si puedo descargar ese archivos de Google Drive, que es el único sitio que tengo para subir archivos, y este archivo pesara alrededor de 500 Mb.

Por cierto, entro bastante al foro para ver si alguien responde, porque no recibo notificaciones por correo, y claro si pasa tiempo pues entiendo que nadie va a responder y dejo de entrar porque doy por perdida la ayuda, y la carpeta Spam la he revidado.

Si se te borra en el emulador, tiene pinta a que el problema esté en el emulador ¿Has probado con un dispositivo real?

También puedes añadir más memoria al emulador, pues quizás esté limitada, tienes un ejemplo de como incrementarla en: https://stackoverflow.com/questions/2239330/how-to-increase-storage-for-android-emulator-install-failed-insufficient-stora

Si pasa lo mismo, y no creo que sea problema de mamoria, porque como te comento puedo copiar archivos de 500 Mb y no hay problema, y es mas, si paso la aplicacion al movil y la ejecuto paso lo mismo, y ahi tambien tengo memoria de sobra.

El caso es que cuando descargo un archivo de Google Drive de mas de 20 Mb, solo crea un archivo de 2,21 Kb. y creo que el codigo esta bien, porque si pongo un archivo de menos de 20 Mb, se descarga sin problemas.

No se porque pasa eso, o donde puede estar el fallo.
Puede que te esté matando Android la descarga al ejecutarse en el hilo principal y bloquearlo, que requiera si o sí AsyncTask.
Puede ser, pero si cortase la descarga, lo logico seria pensar que tambien mataria la descargas que tienen un peso de hasta 20 Mb, porque a partir de ahí, ya no deja descargar nada.
 
Podrias hacerme el favor, de ponerme un codigo para ver como descargar con AsyncTask, he intentado buscar algo pero los codigos que veo parece que estan incompletos, y no puedo hacer nada.

Android mata por tiempo bloqueado el hilo principal y puede que 20MiB le de tiempo.

El ejemplo de más arriba que puse usa AsyncTask con Buffers, sería cambiar los Buffers a DownloadManager.

También tienes ejemplos y recomendaciones de no cargar demasiado la memoria principal en: https://developer.android.com/guide/components/processes-and-threads

pero yo creo que el problema esta en Google Drive, aunque no estoy seguro, pienso eso, porque si pongo un enlace al servidor OnDrive o DropBox, bajo archivos de mayor tamaño sin problemas.

Bueno parece que cuando pasa un determinado tamaño el archivo la pagina web muestra este mensaje

si se pulsa ese botón la descaraga continua, en cambio desde una aplicacion de android no se muestra ese menjase por lo que la descarga sigue es cuando descargar un archivo con esos 2,21 Kb.

 

Lo he probado descargando ese archivo desde un WebView y muestra esa pagina en la aplicacion y sigue la descarga, por lo que si se descarga con otro sistema que no sea webview no muestra ese mensaje.

Que se puede hacer para quitar esa limitacion ?