Android简单实现文件下载
程序员文章站
2022-03-09 23:53:57
本文实例为大家分享了android简单实现文件下载的具体代码,供大家参考,具体内容如下权限
本文实例为大家分享了android简单实现文件下载的具体代码,供大家参考,具体内容如下
权限
<!-- 文件读写权限 --> <uses-permission android:name="android.permission.read_external_storage" /> <!-- 访问内存 --> <uses-permission android:name="android.permission.write_external_storage" />
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
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/dp_20" android:orientation="vertical"> <progressbar android:id="@+id/id_progress" style="?android:attr/progressbarstylehorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /> <textview android:id="@+id/id_text" android:layout_width="match_parent" android:layout_margintop="10dp" android:gravity="right" android:text="0 %" android:layout_height="wrap_content"/> </linearlayout>
**工具类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(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。