Fetch é uma biblioteca gerenciadora de download de arquivos simples, poderosa e personalizável para Android.
API simples e fácil de usar.
Download contínuo em segundo plano.
Suporte para download simultâneo.
Capacidade de pausar e retomar downloads.
Defina a prioridade de um download.
Suporte para download específico da rede.
Capacidade de tentar novamente downloads com falha.
Capacidade de agrupar downloads.
Progresso fácil e rastreamento de status.
Baixe o relatório de tempo restante (ETA).
Baixe relatórios de velocidade.
Salve e recupere informações de download a qualquer momento.
Suporte de notificação.
Estrutura de acesso ao armazenamento, provedor de conteúdo e suporte a URI.
E mais...
Se estiver salvando downloads fora da sandbox do seu aplicativo, você precisará adicionar as seguintes permissões de armazenamento ao manifesto do seu aplicativo. Para o Android SDK versão 23(M) e superior, você também precisará solicitar explicitamente essas permissões ao usuário.
Além disso, como você usará a Internet para baixar arquivos. Precisamos adicionar as permissões de acesso à Internet no Manifesto.
Usar o Fetch é fácil! Basta adicionar a dependência do Gradle ao arquivo build.gradle do seu aplicativo.
implementação "com.tonyodev.fetch2:fetch2:3.0.12"
Uso do Androidx:
implementação "androidx.tonyodev.fetch2:xfetch2:3.1.6"
Em seguida, obtenha uma instância do Fetch e solicite um download.
classe pública TestActivity estende AppCompatActivity {private Fetch fetch; @Override protegido void onCreate(@Nullable Bundle salvoInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(este) .setDownloadConcurrentLimit(3) .construir(); buscar = Fetch.Impl.getInstance(fetchConfiguration); String url = "http:www.example.com/test.txt"; Arquivo de string = "/downloads/test.txt"; solicitação final solicitação = nova solicitação (url, arquivo); request.setPriority(Priority.HIGH); request.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); fetch.enqueue(request, updateRequest -> { //A solicitação foi enfileirada para download com sucesso. }, error -> { //Ocorreu um erro ao enfileirar a solicitação. }); } }
Acompanhar o progresso e o status de um download é muito fácil com o Fetch. Basta adicionar um FetchListener à sua instância Fetch e o ouvinte será notificado sempre que o status ou o progresso de um download mudar.
FetchListener fetchListener = new FetchListener() { @Override public void onQueued(@NotNull Download download, boolean waitOnNetwork) { if (request.getId() == download.getId()) { showDownloadInList(download); } } @Override public void onCompleted(@NotNull Baixar download) { } @Override public void onError(@NotNull Download download) { Error error = download.getError(); } @Override public void onProgress(@NotNull Baixar download, longo etaInMilliSeconds, longo baixadoBytesPerSecond) { if (request.getId() == download.getId()) { updateDownload(download, etaInMilliSeconds); } int progresso = download.getProgress(); } @Override public void onPaused(@NotNull Download download) { } @Override public void onResumed(@NotNull Baixar download) { } @Override public void onCancelled(@NotNull Baixar download) { } @Override public void onRemoved(@NotNull Baixar download) { } @Override public void onDeleted(@NotNull Baixar download) { } };fetch.addListener(fetchListener);//Remove o ouvinte quando terminar.fetch.removeListener(fetchListener);
Fetch suporta pausar e retomar downloads usando o ID da solicitação. O ID de uma solicitação é um identificador exclusivo que mapeia uma solicitação para um Fetch Download. Um download retornado pelo Fetch terá um ID que corresponde ao ID da solicitação que iniciou o download.
Solicitação request1 = new Request(url, arquivo);Solicitação request2 = new Request(url2, file2);fetch.pause(request1.getId()); ...fetch.resume(request2.getId());
Você pode consultar o Fetch para obter informações de download de diversas maneiras.
//Consulte todos os downloadsfetch.getDownloads(new Func>() { @Override public void call(List extends Download> downloads) { //Acesse todos os downloads aqui } });//Obter todos os downloads com statusfetch.getDownloadsWithStatus(Status.DOWNLOADING, new Func
>() { @Override public void call(List extends Download> downloads) { //Acessar downloads que estão baixando } });// Você também pode acessar downloads agrupadosint groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List extends Download> downloads) { / /Acessar downloads agrupados } });
Quando terminar uma instância do Fetch, simplesmente libere-a.
//fazer workfetch.close();//fazer mais trabalho
Por padrão, o Fetch usa o cliente HttpUrlConnection por meio do HttpUrlConnectionDownloader para baixar solicitações. Adicione a seguinte dependência do Gradle ao build.gradle do seu aplicativo para usar o OkHttp Downloader. Você pode criar seus downloaders personalizados, se necessário. Consulte a documentação Java para obter detalhes.
implementação "com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12"
Uso do Androidx:
implementação "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6"
Defina o OkHttp Downloader para Fetch usar.
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(10) .setHttpDownloader(novo OkHttpDownloader(okHttpClient)) .build();Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
Se você quiser aproveitar as vantagens dos recursos do RxJava2 ao usar o Fetch, adicione a seguinte dependência gradle ao arquivo build.gradle do seu aplicativo.
implementação "com.tonyodev.fetch2rx:fetch2rx:3.0.12"
Uso do Androidx:
implementação "androidx.tonyodev.fetch2rx:xfetch2rx:3.1.6"
O RxFetch torna muito fácil enfileirar solicitações de download e consultar downloads usando métodos funcionais rxJava2.
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this).build();Rxfetch rxFetch = RxFetch.Impl.getInstance(fetchConfiguration);rxFetch.getDownloads() .asFlowable() .subscribe(new Consumer>() { @Override public void accept(List
downloads) throws Exception { //Acessar resultados } }, new Consumer () { @Override public void accept(Throwable throwable) throws Exception { //Ocorreu um erro final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
Apresentando o FetchFileServer. O FetchFileServer é um servidor de arquivos TCP leve que atua como um servidor de arquivos HTTP projetado especificamente para compartilhar arquivos entre dispositivos Android. Você pode hospedar recursos de arquivo com o FetchFileServer em um dispositivo e ter que buscar arquivos de download do servidor em outro dispositivo. Consulte o aplicativo de exemplo para obter mais informações. Wiki no FetchFileServer será adicionado nos próximos dias.
Comece a usar FetchFileServer adicionando a dependência gradle ao arquivo build.gradle do seu aplicativo.
implementação "com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12"
Uso do Androidx:
implementação "androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6"
Inicie uma instância FetchFileServer e adicione arquivos de recursos que ela possa servir aos clientes conectados.
classe pública TestActivity estende AppCompatActivity { FetchFileServer fetchFileServer; @Override protegido void onCreate(@Nullable Bundle salvoInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = novo FetchFileServer.Builder(este) .construir(); fetchFileServer.start(); //ouvir conexões do cliente File file = new File("/downloads/testfile.txt"); FileResource fileResource = new FileResource(); fileResource.setFile(file.getAbsolutePath()); fileResource.setLength(file.length()); fileResource.setName("testfile.txt"); fileResource.setId(UUID.randomUUID().hashCode()); fetchFileServer.addFileResource(fileResource); } @Override protegido void onDestroy() { super.onDestroy(); fetchFileServer.shutDown(falso); } }
Baixar um arquivo de um FetchFileServer usando o Fetch é fácil.
classe pública TestActivity estende AppCompatActivity { Fetch fetch; @Override protegido void onCreate(@Nullable Bundle salvoInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(este) .setFileServerDownloader(new FetchFileServerDownloader()) //tem que definir o downloader do servidor de arquivos .construir(); buscar = Fetch.Impl.getInstance(fetchConfiguration); buscar.addListener(fetchListener); Arquivo de string = "/downloads/sample.txt"; String url = novo FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //ip e porta do servidor de arquivos .setFileResourceIdentifier("testfile.txt") //nome ou id do recurso do arquivo .criar(); Solicitação de solicitação = nova Solicitação(url, arquivo); fetch.enqueue(request, request1 -> { //Solicitação enfileirada para download }, erro -> { //Erro ao enfileirar o download }); } @Override protegido void onResume() { super.onResume(); buscar.addListener(fetchListener); } @Override protegido void onPause() { super.onPause(); buscar.removeListener(fetchListener); } @Override protegido void onDestroy() { super.onDestroy(); buscar.close(); } private FetchListener fetchListener = new AbstractFetchListener() { @Override public void onProgress(@NotNull Baixar download, longo etaInMilliSeconds, longo baixadoBytesPerSecond) { super.onProgress(download, etaInMilliSeconds, baixadoBytesPerSecond); Log.d("TestActivity", "Progresso: " + download.getProgress()); } @Override public void onError(@NotNull Download download) { super.onError(download); Log.d("TestActivity", "Erro: " + download.getError().toString()); } @Override public void onCompleted(@NotNull Download download) { super.onCompleted(download); Log.d("TestActivity", "Concluído"); } }; }
Migre downloads de Fetch1 para Fetch2 usando o assistente de migração. Adicione a seguinte dependência gradle ao arquivo build.gradle do seu aplicativo.
implementação "com.tonyodev.fetchmigrator:fetchmigrator:3.0.12"
Uso do Androidx:
implementação "androidx.tonyodev.fetchmigrator:xfetchmigrator:3.1.6"
Em seguida, execute o Migrador.
if (!didMigrationRun()) { //A migração deve ser executada em um thread em segundo plano new Thread(new Runnable() { @Override public void run() { try { final ListtransferidoDownloads = FetchMigrator.migrateFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE); //TODO: atualizar referências externas de ids para (DownloadTransferPair transferidoDownload: transferidoDownloads) { Log.d("newDownload", transferidoDownload.getNewDownload().toString()); Log.d("oldId em Fetch v1", transferidoDownload.getOldID() + ""); } FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun(true); //Configure e execute o Fetch2 após a migração } catch (SQLException e) { e.printStackTrace(); } } }).começar(); } else { //Configurar e executar o Fetch2 normalmente }
A busca só pode melhorar se você fizer contribuições de código. Encontrou um bug? Denuncie. Tem uma ideia de recurso que adoraria ver no Fetch? Contribua com o projeto!
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.