Android简单实现文件下载

作者:Simon66991 时间:2023-08-28 06:33:17 

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

来源:https://blog.csdn.net/weixin_44177244/article/details/117661657

标签:Android,文件下载
0
投稿

猜你喜欢

  • Android实现绘制LocationMarkerView图的示例代码

    2023-01-14 07:55:29
  • Java spring的三种注入方式详解流程

    2021-07-02 12:25:47
  • 详解Flutter网络图片本地缓存的实现

    2023-08-18 19:44:43
  • springboot与vue详解实现短信发送流程

    2023-05-24 14:55:29
  • C#给picturebox控件加图片选中状态的2个方法

    2022-06-03 01:37:03
  • Java实现单向链表反转

    2023-11-18 01:03:11
  • winform实现创建最前端窗体的方法

    2023-07-12 09:50:43
  • IOS 实现摇一摇的操作

    2023-07-02 13:46:53
  • Android中使用Notification实现状态栏的通知

    2022-09-12 00:49:39
  • java实现分页显示效果

    2021-12-29 20:17:43
  • Java编程枚举类实战代码分享

    2023-10-16 09:36:51
  • Java8 Instant时间戳使用小记

    2023-05-31 10:33:59
  • java 获取当前路径下的所有xml文档的方法

    2021-08-08 13:54:29
  • Android对话框使用方法详解

    2023-11-09 03:37:51
  • SpringBoot去除参数前后空格和XSS过滤

    2023-07-27 02:33:56
  • idea打包java程序(包含依赖的所有jar包)

    2023-02-13 00:10:26
  • Java判断字符串是否是整数或者浮点数的方法

    2022-04-30 10:06:20
  • C#6.0新语法示例详解

    2023-11-16 03:43:42
  • IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)

    2023-03-10 16:13:45
  • SeekBar拖动条的应用实例

    2022-01-28 05:33:34
  • asp之家 软件编程 m.aspxhome.com