千家信息网

Android怎么实现文件下载功能

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要讲解了"Android怎么实现文件下载功能",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android怎么实现文件下载功能"吧!权限
千家信息网最后更新 2025年02月01日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怎么实现文件下载功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0