当前位置 博文首页 > 文章内容

    Android简单实现文件下载

    作者:21344 栏目:未分类 时间:2021-09-12 14:44:04

    本文实例为大家分享了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();
            }
        }
    }

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