Android简单实现文件下载

本文实例为大家分享了Android简单实现文件下载的具体代码,供大家参考,具体内容如下
权限


DownloadOkHttp 使用(无显示)
下载完成地址: /storage/emulated/0/小红书/xiaohongshu.apk
DownloadUtil.DownloadOkHttp.get().download(apk, Environment.getExternalStorageDirectory() + "/" + "小红书", new DownloadUtil.DownloadOkHttp.OnDownloadListener() {@Overridepublic void onDownloadSuccess() {Log.e("下载","成功"); }@Overridepublic void onDownloading(int progress) {Log.e("下载", String.valueOf(progress)); }@Overridepublic void onDownloadFailed() {Log.e("下载","失败"); } });

Download 使用(有显示)
下载完成地址: /小红书/小红书.apk
new DownloadUtil.Download(this, apk, "小红书.apk", "小红书");

dialog_progress

【Android简单实现文件下载】**工具类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() {@Overridepublic void onFailure(Call call, IOException e) {// 下载失败listener.onDownloadFailed(); }@Overridepublic 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* 从下载连接中解析出文件名*/@NonNullpublic 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 = ""; //下载的URLprivate 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 隐藏当前对话框dialog.dismiss(); // 设置下载状态为取消mIsCancel = true; }}); mDownloadDialog = builder.create(); mDownloadDialog.show(); // 下载文件downloadFile(); }/*** 下载文件*/private void downloadFile() {new Thread(new Runnable() {@Overridepublic 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(); }}}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读