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();
        }
    }
}

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

时间: 2021-09-12

android实现文件下载功能

android 在网络上下载文件,供大家参考,具体内容如下 步骤 : 1.使用HTTP协议下载文件 - 创建一个HttpURLConnection对象 : HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); - 获取一个InputStream对象 : urlConn.getInputStream() - 访问网络的权限 : android.permission.INTERNET 2.将下载的文件写入SDCAR

Android文件下载功能实现代码

本文实例为大家分享了Android文件下载功能的具体代码,供大家参考,具体内容如下 1.普通单线程下载文件: 直接使用URLConnection.openStream()打开网络输入流,然后将流写入到文件中! public static void downLoad(String path,Context context)throws Exception { URL url = new URL(path); InputStream is = url.openStream(); //截取最后的文件名

Android基于HttpUrlConnection类的文件下载实例代码

废话不多说了,直接给大家贴代码了,具体代码如所示: /** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param path */ private void httpDown(final String path) { new Thread() { @Override public void run() { URL url; HttpURLConnection connectio

Android 文件下载三种基本方式

一.自己封装URLConnection 连接请求类 public void downloadFile1() { try{ //下载路径,如果路径无效了,可换成你的下载路径 String url = "http://c.qijingonline.com/test.mkv"; String path = Environment.getExternalStorageDirectory().getAbsolutePath(); final long startTime = System.cur

Android 将文件下载到指定目录的实现代码

废话不多说了额,直接给大家贴代码了,具体代码如下所示: /** * 下载指定路径的文件,并写入到指定的位置 * * @param dirName * @param fileName * @param urlStr * @return 返回0表示下载成功,返回1表示下载出错 */ public int downloadFile(String dirName, String fileName, String urlStr) { OutputStream output = null; try { //

Android zip文件下载和解压实例

下载:DownLoaderTask.java 复制代码 代码如下: package com.johnny.testzipanddownload; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IO

Android Retrofit文件下载进度显示问题的解决方法

综述 在Retrofit2.0使用详解这篇文章中详细介绍了retrofit的用法.并且在retrofit中我们可以通过ResponseBody进行对文件的下载.但是在retrofit中并没有为我们提供显示下载进度的接口.在项目中,若是用户下载一个文件,无法实时给用户显示下载进度,这样用户的体验也是非常差的.那么下面就介绍一下在retrofit用于文件的下载如何实时跟踪下载进度. 演示 Retrofit文件下载进度更新的实现 在retrofit2.0中他依赖于Okhttp,所以如果我们需要解决这个

Android实现文件下载进度显示功能

和大家一起分享一下学习经验,如何实现Android文件下载进度显示功能,希望对广大初学者有帮助. 先上效果图: 上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部的文本控件用来现在文件下载的百分比,最下方的ImageView用来展示下载好的文件,项目的目的就是动态向用户展示文件的下载量. 下面看代码实现:首先是布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

Android实现简单的文件下载与上传

文件下载 /** * 下载服务 IntentService * 生命周期: * 1>当第一次启动IntentService时,Android容器 * 将会创建IntentService对象. * 2>IntentService将会在工作线程中轮循消息队列, * 执行每个消息对象中的业务逻辑. * 3>如果消息队列中依然有消息,则继续执行, * 如果消息队列中的消息已经执行完毕, * IntentService将会自动销毁,执行onDestroy方法. */ public class Do

Android文件下载进度条的实现代码

main.xml: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_paren

Android横向进度条演示效果

进度条:相信大家也都明白,有了进度条,那么给用户就不会造成,长时间的等待而觉得自己的程序挂掉了,所以,这个小demo还是可一看看的,那么接下来,然我们来看看到底是如何实现的. 1.效果图: 2.布局说明: 1.textview显示进度条 2.ProgressBar进度条 3.进度条配置: <ProgressBar android:id="@+id/pb" style="@android:style/Widget.ProgressBar.Horizontal"

Android ProgressBar直线进度条的实例代码

直线进度条效果图: 点击下载后的效果图: 布局xml文件: empty Java代码: package com.example.android_rogressbar; import android.os.Handler; import android.os.Message; import android.os.StrictMode; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import

Android环形进度条(安卓默认形式)实例代码

Android开发中,有很多的功能在实际应用中都起了很大的作用,比如android进度条的实现方式,下面给大家介绍Android环形进度条(安卓默认形式),具体内容如下所示: .xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_widt

android自定义进度条渐变圆形

在安全卫生上,经常看到有圆形的进度条在转动,效果非常好看,于是就尝试去实现一下,具体实现过程不多说了,直接上效果图,先炫耀下. 效果图: 分析:比较常见于扫描结果.进度条等场景 利用canvas.drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)绘制圆弧 Paint的一些属性定义粗细.颜色.样式等 LinearGradient实现颜色的线型渐变 同样的道理,可以画出长条进度

自定义Android六边形进度条(附源码)

本文实例讲述了Android自定义圆形进度条,分享给大家供大家参考.具体如下: 大家也可以参考这两篇文章进行学习: <自定义Android圆形进度条(附源码)>   <Android带进度的圆形进度条> 运行效果截图如下: 主要代码: package com.sxc.hexagonprogress; import java.util.Random; import android.content.Context; import android.content.res.ColorSta

Android条纹进度条的实现(调整view宽度仿进度条)

前言 本文主要给大家介绍了关于Android条纹进度条(调整view宽度仿进度条)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 美工同学指定了一个进度条样式 进度条样式 这斑斓的进度条,如果要自己画实在是劳民伤财.于是请美工切了一张素材. 素材样例 如果用shape或者.9图片不太好处理这个条纹.转变思路,放置2张图片.一张作为背景(底,bottom),一张作为进度条图片(cover). 进度改变时,改变上面图片的宽度. 这就要求上面的图片是圆角的.自定

VB.NET进度条的方法代码

1.创建进度条: 复制代码 代码如下: <DIV id="Lay1" style="Z-INDEX: 1; LEFT: 1%; VISIBILITY: hidden; WIDTH: 99%; CURSOR: crosshair; POSITION: absolute; TOP: 32px; HEIGHT: 95%; BACKGROUND-COLOR: #ffffff"><FONT face="宋体"></FONT&g

Linux下简易进度条的实现代码

在生活中,进度条是很常见的,那么,进度条是如何实现的呢? 首先,进度条的动态是利用人眼视觉暂留效果的.实际上是如下过程: 先输出:[=     ]表示进度是1%,刷新之后 再输出:[==    ]......由于刷新的很快,所以看起来像是等号不断向后增加,直到进度完成. 在写这个程序之前我们需要了解一下的知识: 1.缓冲区 缓冲区分为无缓冲.行缓冲.全缓冲. 无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr. 行缓冲:表示的是输入输出遇到换行才执行真正的I/O操

BootStrap Progressbar 实现大文件上传的进度条的实例代码

1.首先实现大文件上传,如果是几兆或者几十兆的文件就用基本的上传方式就可以了,但是如果是大文件上传的话最好是用分片上传的方式.我这里主要是使用在客户端进行分片读取到服务器段,然后保存,到了服务器段读取完了之后将分片数据进行组合. 2.前端代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UploadTest2.aspx.cs" Inherits="Htm