Fetch es una biblioteca de gestión de descargas de archivos sencilla, potente y personalizable para Android.
API simple y fácil de usar.
Descarga continua en segundo plano.
Soporte de descarga simultánea.
Posibilidad de pausar y reanudar descargas.
Establece la prioridad de una descarga.
Soporte de descarga específica de la red.
Posibilidad de reintentar descargas fallidas.
Posibilidad de agrupar descargas.
Fácil seguimiento del progreso y del estado.
Descargue el informe de tiempo restante (ETA).
Descargar informes de velocidad.
Guarde y recupere información de descarga en cualquier momento.
Soporte de notificaciones.
Marco de acceso al almacenamiento, proveedor de contenido y compatibilidad con URI.
Y más...
Si guarda descargas fuera del entorno limitado de su aplicación, deberá agregar los siguientes permisos de almacenamiento al manifiesto de su aplicación. Para la versión 23(M) y superior del SDK de Android, también deberá solicitar explícitamente estos permisos al usuario.
Además, como vas a utilizar Internet para descargar archivos. Necesitamos agregar los permisos de acceso a Internet en el Manifiesto.
¡Usar Fetch es fácil! Simplemente agregue la dependencia de Gradle al archivo build.gradle de su aplicación.
implementación "com.tonyodev.fetch2:fetch2:3.0.12"
Uso de Androidx:
implementación "androidx.tonyodev.fetch2:xfetch2:3.1.6"
A continuación, obtenga una instancia de Fetch y solicite una descarga.
la clase pública TestActivity extiende AppCompatActivity {privada Fetch fetch; @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = nuevo FetchConfiguration.Builder(este) .setDownloadConcurrentLimit(3) .construir(); buscar = Fetch.Impl.getInstance(fetchConfiguration); URL de cadena = "http:www.example.com/test.txt"; Archivo de cadena = "/descargas/test.txt"; solicitud de solicitud final = nueva solicitud (url, archivo); request.setPriority(Prioridad.ALTA); request.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); fetch.enqueue(request, updateRequest -> { //La solicitud se puso en cola correctamente para su descarga. }, error -> { //Se produjo un error al poner en cola la solicitud. }); } }
Seguir el progreso y el estado de una descarga es muy fácil con Fetch. Simplemente agregue un FetchListener a su instancia de Fetch y el oyente recibirá una notificación cada vez que cambie el estado o el progreso de una descarga.
FetchListener fetchListener = new FetchListener() { @Override public void onQueued(@NotNull Descargar descarga, boolean esperandoOnNetwork) { if (request.getId() == download.getId()) { showDownloadInList(descargar); } } @Override public void onCompleted(@NotNull Descargar descarga) { } @Override public void onError (@NotNull Descargar descarga) { Error error = download.getError(); } @Override public void onProgress (@NotNull Descargar descarga, larga etaInMilliSeconds, larga descargadaBytesPerSecond) { if (request.getId() == descargar.getId()) { updateDownload(descargar, etaInMilliSeconds); } int progreso = descargar.getProgress(); } @Override public void onPaused (@NotNull Descargar descarga) { } @Override public void onResumed (@NotNull Descargar descarga) { } @Override public void onCancelled (@NotNull Descargar descarga) { } @Override public void onRemoved (@NotNull Descargar descarga) { } @Override public void onDeleted (@NotNull Descargar descarga) { } };fetch.addListener(fetchListener);//Eliminar el oyente cuando esté listo.fetch.removeListener(fetchListener);
Fetch admite pausar y reanudar descargas utilizando la identificación de la solicitud. La identificación de una solicitud es un identificador único que asigna una solicitud a una descarga de recuperación. Una descarga devuelta por Fetch tendrá una identificación que coincida con la identificación de la solicitud que inició la descarga.
Solicitud solicitud1 = nueva Solicitud (url, archivo); Solicitud solicitud2 = nueva Solicitud (url2, archivo2); fetch.pause (request1.getId()); ...fetch.resume(request2.getId());
Puede consultar Fetch para obtener información de descarga de varias maneras.
//Consulta todas las descargasfetch.getDownloads(new Func>() { @Override public void call(List extends Download> descargas) { //Accede a todas las descargas aquí } });//Obtener todas las descargas con statusfetch.getDownloadsWithStatus(Status.DOWNLOADING, new Func
>() { @Override public void call(List extends Download> downloads) { //Acceder a las descargas que se estan descargando } });// También puedes acceder a descargas agrupadasint groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List extends Download> descargas) { / /Acceder a descargas agrupadas } });
Cuando haya terminado con una instancia de Fetch, simplemente libérela.
//hacer trabajofetch.close();//hacer más trabajo
De forma predeterminada, Fetch utiliza el cliente HttpUrlConnection a través de HttpUrlConnectionDownloader para descargar solicitudes. Agregue la siguiente dependencia de Gradle al build.gradle de su aplicación para usar OkHttp Downloader en su lugar. Puede crear sus descargadores personalizados si es necesario. Consulte los documentos de Java para obtener más detalles.
implementación "com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12"
Uso de Androidx:
implementación "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6"
Configure el descargador OkHttp para que Fetch lo use.
OkHttpClient okHttpClient = nuevo OkHttpClient.Builder().build();FetchConfiguration fetchConfiguration = nuevo FetchConfiguration.Builder(este) .setDownloadConcurrentLimit(10) .setHttpDownloader (nuevo OkHttpDownloader (okHttpClient)) .build();Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
Si desea aprovechar las funciones de RxJava2 al utilizar Fetch, agregue la siguiente dependencia de gradle al archivo build.gradle de su aplicación.
implementación "com.tonyodev.fetch2rx:fetch2rx:3.0.12"
Uso de Androidx:
implementación "androidx.tonyodev.fetch2rx:xfetch2rx:3.1.6"
RxFetch hace que sea muy fácil poner en cola solicitudes de descarga y consultar descargas utilizando métodos funcionales rxJava2.
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this).build();Rxfetch rxFetch = RxFetch.Impl.getInstance(fetchConfiguration);rxFetch.getDownloads() .asFlowable() .subscribe(new Consumer>() { @Override public void aceptar(List
descargas) throws Exception { //Acceder a los resultados } }, new Consumer () { @Override public void aceptar(Throwable throwable) throws Exception { //Ocurrió un error final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
Presentamos FetchFileServer. FetchFileServer es un servidor de archivos TCP liviano que actúa como un servidor de archivos HTTP diseñado específicamente para compartir archivos entre dispositivos Android. Puede alojar recursos de archivos con FetchFileServer en un dispositivo y tener que recuperar archivos descargados del servidor en otro dispositivo. Consulte la aplicación de muestra para obtener más información. En los próximos días se agregará Wiki en FetchFileServer.
Comience a usar FetchFileServer agregando la dependencia gradle al archivo build.gradle de su aplicación.
implementación "com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12"
Uso de Androidx:
implementación "androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6"
Inicie una instancia de FetchFileServer y agregue archivos de recursos que pueda servir a los clientes conectados.
la clase pública TestActivity extiende AppCompatActivity { FetchFileServer fetchFileServer; @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = nuevo FetchFileServer.Builder(este) .construir(); fetchFileServer.start(); //escucha las conexiones del cliente File file = new File("/downloads/testfile.txt"); FileResource fileResource = nuevo FileResource(); fileResource.setFile(file.getAbsolutePath()); fileResource.setLength(archivo.length()); fileResource.setName("testfile.txt"); fileResource.setId(UUID.randomUUID().hashCode()); fetchFileServer.addFileResource(fileResource); } @Override protected void onDestroy() { super.onDestroy(); fetchFileServer.shutDown(falso); } }
Descargar un archivo desde FetchFileServer usando Fetch es fácil.
la clase pública TestActivity extiende AppCompatActivity { Fetch fetch; @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = nuevo FetchConfiguration.Builder(este) .setFileServerDownloader(new FetchFileServerDownloader()) //tiene que configurar el descargador del servidor de archivos .construir(); buscar = Fetch.Impl.getInstance(fetchConfiguration); buscar.addListener(fetchListener); Archivo de cadena = "/descargas/sample.txt"; URL de cadena = nuevo FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //ip y puerto del servidor de archivos .setFileResourceIdentifier("testfile.txt") //nombre o identificación del recurso de archivo .crear(); Solicitud de solicitud = nueva Solicitud (url, archivo); fetch.enqueue(solicitud, solicitud1 -> { //Solicitud en cola para descarga }, error -> { //Error al poner en cola la descarga }); } @Override protected void onResume() { super.onResume(); buscar.addListener(fetchListener); } @Override protected void onPause() { super.onPause(); recuperar.removeListener(fetchListener); } @Override protected void onDestroy() { super.onDestroy(); buscar.cerrar(); } FetchListener privado fetchListener = new AbstractFetchListener() { @Override public void onProgress(@NotNull Descargar descarga, larga etaInMilliSeconds, larga descargadaBytesPerSecond) { super.onProgress(descarga, etaInMilliSeconds, descargadaBytesPerSecond); Log.d("TestActivity", "Progreso: " + download.getProgress()); } @Override public void onError(@NotNull Descargar descarga) { super.onError(descargar); Log.d("TestActivity", "Error: " + download.getError().toString()); } @Override public void onCompleted(@NotNull Descargar descarga) { super.onCompleted(descargar); Log.d("TestActivity", "Completado"); } }; }
Migre descargas de Fetch1 a Fetch2 usando el asistente de migración. Agregue la siguiente dependencia de gradle al archivo build.gradle de su aplicación.
implementación "com.tonyodev.fetchmigrator:fetchmigrator:3.0.12"
Uso de Androidx:
implementación "androidx.tonyodev.fetchmigrator:xfetchmigrator:3.1.6"
Luego ejecute el Migrador.
if (!didMigrationRun()) { //La migración debe ejecutarse en un hilo en segundo plano new Thread(new Runnable() { @Override public void run() { try { final ListtransferidoDownloads = FetchMigrator.migrateFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE); //TODO: actualizar referencias externas de identificadores para (DownloadTransferPair transferidoDownload: transferidosDownloads) { Log.d("newDownload", transferidoDownload.getNewDownload().toString(); Log.d("oldId en Fetch v1", transferidoDownload.getOldID() + ""); } FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun(verdadero); //Configurar y ejecutar Fetch2 después de la migración } captura (SQLException e) { e.printStackTrace(); } } }).comenzar(); } else { //Configurar y ejecutar Fetch2 normalmente }
Fetch solo puede mejorar si realiza contribuciones de código. ¿Encontraste un error? Denúncialo. ¿Tiene una idea de función que le encantaría ver en Fetch? ¡Contribuye al proyecto!
Copyright (C) 2017 Tonyo Francis. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.