Android怎么实现文件下载功能
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,这篇文章主要讲解了"Android怎么实现文件下载功能",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android怎么实现文件下载功能"吧!权限
千家信息网最后更新 2025年11月14日Android怎么实现文件下载功能
这篇文章主要讲解了"Android怎么实现文件下载功能",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android怎么实现文件下载功能"吧!
权限
DownloadOkHttp 使用(无显示)
下载完成地址: /storage/emulated/0/小红书/xiaohongshu.apk
DownloadUtil.DownloadOkHttp.get().download(apk, Environment.getExternalStorageDirectory() + "/" + "小红书", new DownloadUtil.DownloadOkHttp.OnDownloadListener() { @Override public void onDownloadSuccess() { Log.e("下载","成功"); } @Override public void onDownloading(int progress) { Log.e("下载", String.valueOf(progress)); } @Override public void onDownloadFailed() { Log.e("下载","失败"); } });Download 使用(有显示)
下载完成地址: /小红书/小红书.apk
new DownloadUtil.Download(this, apk, "小红书.apk", "小红书");
dialog_progress
**工具类DownloadUtil(两个实现方法,自己悟!!!)
package com.simon.util;import android.app.AlertDialog;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.widget.ProgressBar;import android.widget.TextView;import com.simon.app.R;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import androidx.annotation.NonNull;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;/** * 创建者: Simon * 创建时间:2021/6/7 13:58 * 描述:文件下载 */public class DownloadUtil { public static class DownloadOkHttp { private static DownloadOkHttp downloadUtil; private final OkHttpClient okHttpClient; public static DownloadOkHttp get() { if (downloadUtil == null) { downloadUtil = new DownloadOkHttp(); } return downloadUtil; } private DownloadOkHttp() { okHttpClient = new OkHttpClient(); } /** * * @param url 下载连接 * @param saveDir 储存下载文件的SDCard目录 * @param listener 下载监听 */ public void download( String url, final String saveDir, final OnDownloadListener listener) { Request request = new Request.Builder().url(url).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 下载失败 listener.onDownloadFailed(); } @Override public void onResponse(Call call, Response response) throws IOException { InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null; // 储存下载文件的目录 String savePath = isExistDir(saveDir); try { is = response.body().byteStream(); long total = response.body().contentLength(); File file = new File(savePath, getNameFromUrl(url)); fos = new FileOutputStream(file); long sum = 0; while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); sum += len; int progress = (int) (sum * 1.0f / total * 100); // 下载中 listener.onDownloading(progress); } fos.flush(); // 下载完成 listener.onDownloadSuccess(); } catch (Exception e) { listener.onDownloadFailed(); } finally { try { if (is != null) is.close(); } catch (IOException e) { } try { if (fos != null) fos.close(); } catch (IOException e) { } } } }); } /** * 判断下载目录是否存在 * @param saveDir * @return * @throws IOException */ private String isExistDir(String saveDir) throws IOException { // 下载位置 File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir); if (!downloadFile.mkdirs()) { downloadFile.createNewFile(); } String savePath = downloadFile.getAbsolutePath(); return savePath; } /** * url * 从下载连接中解析出文件名 */ @NonNull public static String getNameFromUrl(String url) { return url.substring(url.lastIndexOf("/") + 1); } public interface OnDownloadListener { /** * 下载成功 */ void onDownloadSuccess(); /** * @param progress * 下载进度 */ void onDownloading(int progress); /** * 下载失败 */ void onDownloadFailed(); } } public static class Download { private String fileSavePath = "";//保存文件的本地路径 private String fileDownLoad_path = "";//下载的URL private String mfileName = "";//下载的文件名字 private boolean mIsCancel = false; private int mProgress; private ProgressBar mProgressBar; private TextView text; private Dialog mDownloadDialog; private final Context context; private static final int DOWNLOADING = 1; private static final int DOWNLOAD_FINISH = 2; private Handler mUpdateProgressHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case DOWNLOADING: // 设置进度条 mProgressBar.setProgress(mProgress); text.setText(String.valueOf(mProgress)); break; case DOWNLOAD_FINISH: // 隐藏当前下载对话框 mDownloadDialog.dismiss(); } } }; /** * 下载初始化 * @param context 上下文 * @param fileDownLoad_path 下载的URL * @param mfileName 下载的文件名字 * @param fileSavePath 保存文件的本地路径 */ public Download(Context context, String fileDownLoad_path, String mfileName, String fileSavePath) { this.context = context; this.fileDownLoad_path = fileDownLoad_path; this.mfileName = mfileName; this.fileSavePath = Environment.getExternalStorageDirectory() + "/" + fileSavePath; showDownloadDialog(); } /** * 显示正在下载的对话框 */ protected void showDownloadDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("下载中"); View view = LayoutInflater.from(context).inflate(R.layout.dialog_progress, null); mProgressBar = (ProgressBar) view.findViewById(R.id.id_progress); text = view.findViewById(R.id.id_text); builder.setView(view); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 隐藏当前对话框 dialog.dismiss(); // 设置下载状态为取消 mIsCancel = true; } }); mDownloadDialog = builder.create(); mDownloadDialog.show(); // 下载文件 downloadFile(); } /** * 下载文件 */ private void downloadFile() { new Thread(new Runnable() { @Override public void run() { try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File dir = new File(fileSavePath); if (!dir.exists()){ dir.mkdirs(); } // 下载文件 HttpURLConnection conn = (HttpURLConnection) new URL(fileDownLoad_path).openConnection(); conn.connect(); InputStream is = conn.getInputStream(); int length = conn.getContentLength(); File apkFile = new File(fileSavePath, mfileName); FileOutputStream fos = new FileOutputStream(apkFile); int count = 0; byte[] buffer = new byte[1024]; while (!mIsCancel) { int numread = is.read(buffer); count += numread; // 计算进度条当前位置 mProgress = (int) (((float) count / length) * 100); // 更新进度条 mUpdateProgressHandler.sendEmptyMessage(DOWNLOADING); // 下载完成 if (numread < 0) { mUpdateProgressHandler.sendEmptyMessage(DOWNLOAD_FINISH); break; } fos.write(buffer, 0, numread); } fos.close(); is.close(); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } }}感谢各位的阅读,以上就是"Android怎么实现文件下载功能"的内容了,经过本文的学习后,相信大家对Android怎么实现文件下载功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
文件
小红
文件下载
功能
进度
对话框
目录
学习
对话
成功
位置
内容
名字
地址
路径
上下
上下文
两个
创建者
就是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全小卫士小讲师
宜信软件开发加班严重吗
网络技术员危险吗
qt创建数据库什么版本
新乡市新景网络技术有限公司
国平网络技术有限公司
曲周软件开发文档在线咨询
软件开发可以入办公费
软件开发类的公司有哪些
苏州直销系统软件开发
云服务器可以用来做软件吗
数据库 scan ip
万代服务器怎么样
服务器网卡千兆变百兆
将服务器上的文件复制到客户端
好用的服务器
忻州网络技术推荐厂家
游戏服务器 linux
企业级数据库应用是什么意思
vfp新建数据库
两年软件开发经验事业编
软件开发公司在哪里找业务
海南省超级服务器虚拟主机
太虚幻境服务器联赛名单
数据库删除表命令
数据库登陆提示时间不符
游戏合并服务器会怎样
湖北盛天网络技术游戏
网民如何看待网络安全
网络安全logo大全