top of page
Search
mandygonzales

Download do gerenciador com barra de progresso exemplo android



Gerenciador de downloads com barra de progresso Exemplo de Android




Baixar arquivos da internet é uma tarefa comum para muitos aplicativos Android. Seja uma imagem, um vídeo, um PDF ou qualquer outro tipo de arquivo, você deseja fornecer uma experiência de download tranquila e confiável para seus usuários. É por isso que você precisa de um gerenciador de downloads.


Um gerenciador de download é um serviço do sistema que lida com downloads HTTP de longa duração. Ele permite que você solicite, monitore, controle e gerencie vários downloads em segundo plano. Ele também lida com problemas comuns, como falhas de rede, reinicializações de dispositivos e atualizações de aplicativos.




download manager with progress bar android example



Uma das características mais importantes de um gerenciador de downloads é uma barra de progresso. Uma barra de progresso é um indicador visual que mostra quanto de um arquivo foi baixado. Ele ajuda o usuário a estimar o tempo restante e o consumo de largura de banda. Ele também fornece feedback sobre o status do download e quaisquer erros que possam ocorrer.


Neste artigo, você aprenderá como usar um gerenciador de downloads com barra de progresso em seu aplicativo Android. Você verá duas maneiras de implementar esse recurso: usando a classe interna DownloadManager do Android e usando uma biblioteca externa chamada Fetch. Você também aprenderá como personalizar seu gerenciador de download com várias opções e configurações.


Como usar a classe Android DownloadManager




A classe Android DownloadManager é um serviço do sistema que você pode acessar de seu aplicativo usando o método getSystemService(). Ele fornece uma API simples e fácil de usar para solicitar e gerenciar downloads.


Como criar uma instância do DownloadManager e solicitar um download




Para criar uma instância de DownloadManager, você precisa passar a constante Context.DOWNLOAD_SERVICE como um argumento para o método getSystemService(). Por exemplo:



DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);


Para solicitar um download, você precisa criar um objeto DownloadManager.Request e passá-lo para o método enqueue() da instância DownloadManager. O objeto Request recebe um objeto Uri como argumento, que representa a URL do arquivo que você deseja baixar. Por exemplo:



Uri uri = Uri.parse(" Solicitação DownloadManager.Request = new DownloadManager.Request(uri); long downloadId = downloadManager.enqueue(request);


O método enqueue() retorna um valor longo que representa o ID exclusivo do download. Você pode usar esse ID posteriormente para consultar ou controlar o download.


Como definir a visibilidade da notificação e o diretório de destino




Por padrão, o DownloadManager mostra uma notificação na barra de status quando um download começa, progride e é concluído. Você pode alterar esse comportamento usando o método setNotificationVisibility() do objeto Request. Esse método usa uma constante int como argumento, que pode ser um dos seguintes:



  • DownloadManager.Request.VISIBILITY_VISIBLE: A notificação fica visível durante o download.



  • DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED: A notificação é visível durante o download e após a conclusão.



  • DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION: A notificação só é visível após a conclusão.



  • DownloadManager.Request.VISIBILITY_HIDDEN: A notificação está oculta.



Por exemplo:



request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);


Por padrão, o DownloadManager salva o arquivo baixado no diretório de armazenamento externo do dispositivo. Você pode alterar isso usando os métodos setDestinationInExternalFilesDir() ou setDestinationInExternalPublicDir() do objeto Request. Esses métodos recebem um Context, um String e um String como argumentos, que representam o contexto, o tipo de diretório e o nome do arquivo, respectivamente. Por exemplo:



request.setDestinationInExternalFilesDir(contexto, Ambiente.DIRECTORY_DOWNLOADS, "arquivo.pdf");


Isso salvará o arquivo no diretório de arquivos externos específicos do aplicativo no subdiretório Downloads.


Como registrar um broadcast receiver para obter o status e o ID do download




Para ser notificado quando um download for concluído ou falhar, você precisa registrar um broadcast receiver que escute as intenções DownloadManager.ACTION_DOWNLOAD_COMPLETE e DownloadManager.ACTION_NOTIFICATION_CLICKED. Você pode fazer isso usando o método registerReceiver() do objeto Context. Por exemplo:



BroadcastReceiver receiver = new BroadcastReceiver() @Override public void onReceive(Context context, Intent intent) String action = intent.getAction(); if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) // Obtenha o id de download da intenção long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); // Consulta o gerenciador de downloads para obter o status e outros detalhes DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(id); Cursor cursor = downloadManager.query(consulta); if (cursor.moveToFirst()) int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); String uri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); // Lida com a chave de status do download (status) case DownloadManager.STATUS_SUCCESSFUL: // Download concluído com sucesso break; case DownloadManager.STATUS_FAILED: // Download falhou break; case DownloadManager.STATUS_PAUSED: // Download pausado break; case DownloadManager.STATUS_PENDING: // Download pendente break; case DownloadManager.STATUS_RUNNING: // Download running break; cursor.close(); else if (action.equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)) // Tratar o clique de notificação ; // Registra o receptor com o filtro de intenção IntentFilter filter = new IntentFilter(); filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);filter.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED); context.registerReceiver(receptor, filtro);


Não se esqueça de cancelar o registro do receptor quando não precisar mais dele usando o método unregisterReceiver() do objeto Context.


Como mostrar a barra de progresso durante o download




Para mostrar uma barra de progresso durante o download, você precisa usar um widget ProgressBar em seu layout XML. Você pode personalizar sua aparência e estilo usando vários atributos. Por exemplo:



Isso criará uma barra de progresso horizontal com um drawable personalizado como plano de fundo.


Como usar o Timer e o Cursor para consultar o andamento do download




Para atualizar a barra de progresso com o progresso atual do download, você precisa consultar o gerenciador de download periodicamente e obter os bytes baixados e o total de bytes do arquivo. Você pode fazer isso usando um Timer e um Cursor. Por exemplo:



// Cria uma tarefa de timer que é executada a cada segundo TimerTask timerTask = new TimerTask() @Override public void run() // Consulta o gerenciador de download para obter os bytes baixados e o total de bytes DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); Cursor cursor = downloadManager.query(consulta); if (cursor.moveToFirst()) int baixadoBytes = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); int totalBytes = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); // Calcula a porcentagem de progresso do download int progress = (int) ((downloadedBytes * 100L) / totalBytes); // Atualize a barra de progresso no encadeamento da IU usando um manipulador handler.post(new Runnable() @Override public void run() progressBar.setProgress(progress); ); cursor.close(); ; // Cria um cronômetro e agenda a tarefa do cronômetro Timer timer = new Timer(); timer.schedule(timerTask, 0, 1000);


Isso atualizará a barra de progresso a cada segundo com a porcentagem atual do progresso do download. Como usar a biblioteca Fetch para gerenciamento avançado de download




Se você deseja mais controle e flexibilidade sobre seu gerenciador de downloads, pode usar uma biblioteca externa chamada Fetch. Fetch é uma biblioteca gerenciadora de downloads poderosa e personalizável para Android. Ele oferece suporte a downloads paralelos, prioridade de download, tipo de rede, grupo, tag, ouvinte e muito mais. Ele também possui um banco de dados integrado para armazenar e gerenciar informações de download.


Como adicionar a dependência Fetch e configurar a instância Fetch




Para usar Fetch em seu aplicativo, você precisa adicionar a seguinte dependência ao arquivo build.gradle de seu aplicativo:



dependencies implementação 'androidx.tonyodev.fetch2:xfetch2:3.1.6'


Para criar uma instância Fetch, você precisa usar a classe FetchConfiguration e passá-la para o método Fetch.Impl.getDefaultInstance(). A classe FetchConfiguration permite personalizar vários aspectos do gerenciador de download, como o namespace, o downloader, o logger, o tipo de rede, o limite simultâneo e muito mais. Por exemplo:



FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(context) .setNamespace("MyApp") .setDownloader(new OkHttpDownloader()) .setLogger(new FetchTimberLogger()) .setNetworkType(NetworkType.ALL) .setConcurrentLimit(3) .build(); Busca busca = Fetch.Impl.getDefaultInstance(fetchConfiguration);


Isso criará uma instância Fetch com o namespace "MyApp", o OkHttp downloader, o Timber logger, o tipo de rede ALL e o limite simultâneo 3.


Como enfileirar, pausar, retomar, cancelar e excluir downloads




Para enfileirar um download, você precisa criar um objeto Request e passá-lo para o método enqueue() da instância Fetch. O objeto Request recebe dois argumentos String, que representam a URL e o caminho do arquivo do download. Você também pode definir várias opções e configurações para a solicitação, como prioridade, tipo de rede, grupo, tag e cabeçalhos. Por exemplo:



Request request = new Request(" "/storage/emulated/0/Download/file.pdf"); request.setPriority(Priority.HIGH); request.setNetworkType(NetworkType.WIFI_ONLY); request.setGroupId(1); request.setTag("PDF"); request.addHeader("Autorização", "Token do portador"); fetch.enqueue(request, updatedRequest -> // Download enfileirado com sucesso , error -> // Falha no download enfileirado );


Isso enfileirará uma solicitação de download com alta prioridade, tipo de rede somente wifi, id de grupo 1, tag "PDF" e um cabeçalho de autorização.


Para pausar um download, você precisa passar o ID do download para o método pause() da instância Fetch. Por exemplo:



buscar.pause(downloadId);


Para retomar um download, você precisa passar o ID do download para o método resume() da instância Fetch. Por exemplo:



buscar.resume(downloadId);


Para cancelar um download, você precisa passar o ID do download para o método cancel() da instância Fetch. Por exemplo:



fetch.cancel(downloadId);


Para excluir um download, você precisa passar o ID do download para o método delete() da instância Fetch. Isso também excluirá o arquivo baixado do dispositivo. Por exemplo:



fetch.delete(downloadId); Como definir prioridade de download, tipo de rede, grupo, tag e ouvinte




Para definir a prioridade de download, você precisa usar o método setPriority() do objeto Request. Esse método usa uma enumeração Priority como um argumento, que pode ser um dos seguintes:



  • Priority.HIGH: O download será processado com alta prioridade.



  • Priority.NORMAL: O download será processado com prioridade normal.



  • Priority.LOW: O download será processado com baixa prioridade.



Por exemplo:



request.setPriority(Priority.HIGH);


Isso definirá a prioridade de download como alta.


Para definir o tipo de rede, você precisa usar o método setNetworkType() do objeto Request. Esse método usa uma enumeração NetworkType como argumento, que pode ser um dos seguintes:



  • NetworkType.ALL: O download pode ser processado em qualquer tipo de rede.



  • NetworkType.WIFI_ONLY: O download só pode ser processado na rede wi-fi.



  • NetworkType.UNMETERED: O download só pode ser processado em rede ilimitada.



Por exemplo:



request.setNetworkType(NetworkType.WIFI_ONLY);


Isso definirá o tipo de rede como somente wifi.


Para definir o id do grupo, você precisa usar o método setGroupId() do objeto Request. Este método recebe um valor int como argumento, que representa o id do grupo ao qual o download pertence. Você pode usar isso para agrupar vários downloads e executar operações em lote neles. Por exemplo:



request.setGroupId(1);


Isso definirá o ID do grupo como 1.


Para definir a tag, você precisa usar o método setTag() do objeto Request. Esse método usa um valor String como argumento, que representa uma tag que pode ser usada para identificar ou filtrar downloads. Você pode usar isso para categorizar ou rotular seus downloads com base em alguns critérios. Por exemplo:



request.setTag("PDF");


Isso definirá a tag como "PDF".


Para definir o ouvinte, você precisa usar o método addListener() da instância Fetch. Esse método usa uma interface FetchListener como argumento, que permite ouvir vários eventos e retornos de chamada relacionados aos seus downloads. Você pode usar isso para atualizar sua IU ou executar algumas ações com base no status do download. Por exemplo:



fetch.addListener(new FetchListener() @Override public void onAdded(@NotNull Download download) // Download adicionado @Override public void onCancelled(@NotNull Download download) // Download cancelado @Override public void onCompleted(@NotNull Download download) // Download concluído @Override public void onDeleted(@NotNull Download download) // Download excluído @O verride public void onDownloadBlockUpdated(@NotNull Download download, @NotNull DownloadBlock downloadBlock, int i) // Bloco de download atualizado @Override public void onError(@NotNull Download download, @NotNull Error error, @Nullable Throwable throwable) // Erro de download @Override public void onPaused(@NotNull Download download) // Download pausado @Override public void onProgress(@NotNull Download download, long l, long l1) // Progresso do download @Override public void onQueued(@NotNull Download download, boolean b) // Download na fila @Override public void onRemoved(@NotNull Download download) // Download removido @Override public void onResumed(@NotNull Download download) // Download retomado @Override public void onStar ted(@NotNull Baixar baixar, @NotNull Listar list, int i) // Download iniciado @Override public void onWaitingNetwork(@NotNull Download download) // Download aguardando rede );


Conclusão




Neste artigo, você aprendeu a usar um gerenciador de downloads com barra de progresso em seu aplicativo Android. Você viu duas maneiras de implementar esse recurso: usando a classe interna DownloadManager do Android e usando uma biblioteca externa chamada Fetch. Você também aprendeu a personalizar seu gerenciador de download com várias opções e configurações.


Usar um gerenciador de download com barra de progresso pode melhorar o desempenho do seu aplicativo e a experiência do usuário. Ele também pode ajudá-lo a lidar com problemas comuns, como falhas de rede, reinicializações de dispositivos e atualizações de aplicativos. Ele também pode dar a você mais controle e flexibilidade sobre seus downloads.Se quiser experimentar os exemplos deste artigo, você pode baixar o código-fonte do GitHub. Você também pode encontrar mais tutoriais e recursos sobre como usar um gerenciador de download com barra de progresso em seu aplicativo Android.


Esperamos que você tenha gostado deste artigo e aprendido algo novo. Se você tiver alguma dúvida, comentário ou feedback, sinta-se à vontade para compartilhá-los conosco. Gostaríamos muito de ouvir sua opinião e ajudá-lo em sua jornada de desenvolvimento do Android.


perguntas frequentes




Aqui estão algumas perguntas frequentes sobre como usar um gerenciador de download com barra de progresso em seu aplicativo Android:


P: Como posso cancelar todos os downloads de uma vez?




R: Você pode usar o método cancelAll() da instância Fetch para cancelar todos os downloads de uma vez. Por exemplo:



fetch.cancelAll();


P: Como posso excluir todos os downloads de uma vez?




R: Você pode usar o método deleteAll() da instância Fetch para excluir todos os downloads de uma vez. Isso também excluirá os arquivos baixados do dispositivo. Por exemplo:



fetch.deleteAll();


P: Como posso filtrar downloads por grupo, tag ou status?




R: Você pode usar o método getDownloads() da instância Fetch para obter uma lista de downloads que correspondem a uma determinada consulta. A consulta pode ser criada usando a classe FetchQuery, que permite especificar vários filtros e condições. Por exemplo:



Consulta FetchQuery = new FetchQuery.Builder() .setGroupId(1) .setTag("PDF") .setStatus(Status.COMPLETED) .build(); fetch.getDownloads(query, result -> // Manipula a lista de resultados de downloads );


P: Como posso pausar ou retomar todos os downloads de uma só vez?




R: Você pode usar os métodos pauseGroup() ou resumeGroup() da instância Fetch para pausar ou retomar todos os downloads que pertencem a um determinado ID de grupo.Por exemplo:



fetch.pauseGroup(1); fetch.resumeGroup(1);


P: Como posso alterar o diretório de download ou o nome do arquivo depois de enfileirar um download?




R: Você pode usar o método updateRequest() da instância Fetch para atualizar a solicitação de download com um novo caminho ou nome de arquivo. Por exemplo:



Solicitação de solicitação = fetch.getRequest(downloadId); request.setFile("/storage/emulated/0/Download/new_file.pdf"); fetch.updateRequest(downloadId, solicitação); 0517a86e26


1 view0 comments

Recent Posts

See All

Baixe a música kacha badam

Baixar Kacha Badam Song: O sucesso viral que todo mundo está falando Se você é ativo nas mídias sociais, especialmente no Instagram, deve...

Null 39;s Royale

Null's Royale: o melhor servidor privado para os fãs do Clash Royale Se você é fã de Clash Royale, o popular jogo de estratégia em tempo...

Comentários


bottom of page