从网络中下载文件保存到SD卡和显示下载进度

Android 下载模块,使用Xutils3 的下载功能,Activity和services数据交互,listview显示下载进度 临近过年,今天将花了两天时间写的下载模块贡献出来,以前我也是天天需要什么功能,就天天查百度,现在自己也能开源一点东西了,也是非常很开心的,hahaha。离职前写了音乐播放器的音乐下载界面,自己封装了下载线程,并使用多线程断点续传下载音乐,感觉多线程下载音乐也并不比单线程下载快多少,就一个4M的音乐来说,开3条线程下了46s,单线程下了60s,如果同时现在3个音乐,那么多线程下载相当于开了9 个线程, 阅读详情

任务:

1.从网络中下载文件存储到SD卡

2.显示下载进度

 

人丑话不多,直接撸代码。

 

xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击我开始下载"
        android:id="@+id/btn_download"
        />


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下载进度:"
        android:layout_marginTop="40dp"/>


    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:progress="100"
        />

</LinearLayout>

 

 

java代码:

package com.example.jiaho.handleproject;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class DownLoadActivity extends AppCompatActivity {

    public static final int DOWNLOAD_MESSAGE_CODE = 10001;
    public static final int DOWNLOAD_MESSAGE_FAIL_CODE = 10002;
    public static final String AppURL = "http://192.168.31.138/mukewang.apk";
    private Button btn_download;
    private ProgressBar progressBar;
    private Handler mHandler;
    private static final int REQUEST_EXTERNAL_STORAGE=1;
    private static String[] PERMISSIONS_STORAGE={
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);
        btn_download=findViewById(R.id.btn_download);
        progressBar=findViewById(R.id.progressBar);
        /*
        * 主线程
        * 1.点击按键
        * 2.发起下载
        * 3.开启子线程做下载
        * 4.下载过程中通知主线程    ------>   主线程更新进度条
        * */

        btn_download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //在子线程中执行download方法
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        download(AppURL);
                    }
                }).start();
            }
        });

        //接收子线程的消息
        mHandler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //处理消息
                switch (msg.what){
                    case DOWNLOAD_MESSAGE_CODE:
                        progressBar.setProgress((int)msg.obj);
                        break;
                    case DOWNLOAD_MESSAGE_FAIL_CODE:
                        Toast.makeText(DownLoadActivity.this,"下载失败",Toast.LENGTH_SHORT).show();
                }
            }
        };

    }

    public void download(String appUrl){
        try {
            //拿到Url
            URL url=new URL(appUrl);
            //打开一个connect
            URLConnection urlConnection=url.openConnection();
            //获取输入流
            InputStream inputStream=urlConnection.getInputStream();
            //获取文件的总长度
            int contentLength=urlConnection.getContentLength();

            //创建一个下载路径
            String downloadFolderName= Environment.getExternalStorageDirectory()+File.separator+"imooc"+File.separator;
            //创建一个文件
            File file=new File(downloadFolderName);

            if(!file.exists()){
                //如果文件不存在,就创建一个文件
                file.mkdir();
            }

            //创建文件
            String fileName=downloadFolderName+"mkapp.apk";
            File fileMove=new File(fileName);

            //如果文件存在就把它删掉,下次运行程序就不会报错
            if (fileMove.exists()){
                fileMove.delete();
            }

            //记录下载的大小
            int downloadSize=0;
            byte[] bytes=new byte[1024];
            int length=0;
            //创建一个输出流
            //verifyStoragePermissions(DownLoadActivity.this);
            OutputStream outputStream=new FileOutputStream(fileName);
            while ((length=inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,length);
                downloadSize+=length;
                /*
                * 每完成一点下载,就及时更新UI
                * */
                Message message = Message.obtain();
                //提取出一个静态变量
                message.what = DOWNLOAD_MESSAGE_CODE;
                message.obj=(downloadSize/contentLength)*100;
                //将消息通过Handle发出去
                mHandler.sendMessage(message);
            }

        }catch (MalformedURLException e){
            //如果下载失败了,也要发送下载失败的消息
            NotifyDownLoadFail();
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
            NotifyDownLoadFail();
        }

    }

    //提取出一个方法
    private void NotifyDownLoadFail() {
        Message message=Message.obtain();
        message.what= DOWNLOAD_MESSAGE_FAIL_CODE;
        mHandler.sendMessage(message);
    }

    //检查权限的方法,android6.0才需要在java代码中实现权限赋予
    public static void verifyStoragePermissions(Activity activity){
        //Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission!= PackageManager.PERMISSION_GRANTED){
            //没有权限,则通知用户
            ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
        }
    }
}

 

解释一下代码段:

//检查权限的方法,android6.0才需要在java代码中实现权限赋予
    public static void verifyStoragePermissions(Activity activity){
        //Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission!= PackageManager.PERMISSION_GRANTED){
            //没有权限,则通知用户
            ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
        }
    }

这个代码在android6.0上才被需要,因为当时写代码时,老是提示权限不够,就在网上查各种资料,所以各种变态权限都试了一遍,足足尝试了2个多小时,发现还是不行。后来我就纳闷了,我的android才4.4啊,根本不需要这些才对啊。于是我重新认真检查代码,发现了一个隐藏至深的bug,真是痛心疾首,老夫捶胸顿足,差点一口老血喷了出来。原来是我写文件路径的时候,将代码File.separator写成了File.pathSeparator。

 

简单讲下File.separator和File.pathSeparator的区别:

File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:

java -cp test.jar;hello.jar

就是指";"

 

 File.separator才是用来分隔同一个路径字符串中的目录,例如:

E:\Android\androidProject

就是指"\"

 

 

 

Android保存文件到SD卡 Android保存文件到SD卡 http://blog.csdn.net/eeeduo/article/details/37913229 立即下载

相关推荐

android 下载文件到SD卡

封装了一个 可以下载网络资源文件的类,实现了将下载的文件存储到SD卡中

Android:文件下载和写入SD卡

一、文件下载        Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:       1.创建一个HttpURLConnection对象: [java] view plaincopy // 创建一个URL对象,urlStr指

a1215445590的专栏 719

android从网络,SD卡获取图片,压缩后显示到界面,可以保存到本地

通过EditText的内容获取网络上的图片 压缩后显示在界面上 可以保存至SD卡 可以根据路径获取SD卡中的图片 可以将分辨率较大的图片等比例压缩至适用型分辨率

Android-使用Http下载文件并保存到本地SD卡

1.AndroidMainfest.xml中设置权限 <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"&gt...

dxm809的博客 3349

Android 下载 Notification通知栏显示

修改android 2.3版本Notification通知栏不显示的Bug Android 服务端下载 Notification通知栏 断点下载

AD7920实战:从咪头到ADC的音频信号采集电路设计全解析(附电路图)

本文详细解析了基于AD7920 ADC芯片的音频信号采集电路设计全流程。从驻极体咪头的驱动、AD8542运放的两级增益与偏置设计,到关键的抗混叠滤波器配置,以及ADC接口的驱动缓冲与PCB布局要点,提供了完整的实战指南与电路图,帮助开发者实现高质量音频信号采集。

red88的博客 802

Android实现下载图片并保存到SD卡中

1.java代码,下载图片的主程序 先实现显示图片,然后点击下载图片按钮,执行下载功能。 从网络上取得的图片,生成Bitmap时有两种方法,一种是先转换为byte[],再生成bitmap;一种是直接用InputStream生成bitmap。 (1)ICS4.0及更高版本中的实现 4.0中不允许在主线程,即UI线程中操作网络,所以必须新开一个线程,在子线程中执行网络连接;然后在主线程中显示图

蓝蓝的天 10万+

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 357

就想下载个文件到SD卡,怎就这么难?快把代码拿走吧

本文简单的介绍了 Android 系统权限收紧的介绍,并且对于如何写入文件方面做了几种适配案的探讨。再次强调,本文只针对文件的写入,对于文件的读取是不适用的,那是另外的事情,对于多媒体图片视频等文件的写入和读取又是另另外的事了,万不可混为一谈。对于文件的写入其实除了以上的方案还可以用 MANAGE_DOCUMENTS 的权限,但是但是个人强烈不推荐使用 android.permission.MANAGE_DOCUMENTS 这样的危险权限方案。

chuyouyinghe的专栏 596

【SOC估算】基于EKF与神经网络融合的锂电池SOC高精度估计及Matlab实现

本文探讨了基于EKF与神经网络融合的锂电池SOC高精度估计方法。通过结合扩展卡尔曼滤波(EKF)的模型驱动优势和神经网络的数据驱动学习能力,实现了对电池荷电状态(SOC)的精准预测。Matlab仿真验证了该混合算法在各种工况下均能显著降低估计误差,提升电池管理系统性能。

play7的博客 695

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

Delphi下载指定网址(URL)的文件,带进度条显示

主要使用的是Delphi自带的TIdhttp控件。 一、界面设置 在窗体上放置两个TEdit控件,一个用于输入要下载的文件URL,一个用于输入要保存到本地的文件路径;放置两个TLabel控件,一个显示文件总大小,一个显示当前已下载大小;放置一个按钮TButton,一个TIdhttp控件(在Indy Clients面板)和一个TIdAntiFreeze控件(放置该控件可避免下载过程中程序

diligentcat的专栏 3449

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 1660

android 多线程并发下载文件

Download.java package com.wansha; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; impo

萧若寒 3716

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.5 V4L2 control的原理和实现

既然涉及到视频输入,就会有很多与 相关的效果,比如对比度、饱和度、色温、白平衡等等,这些都是通用的、必须的控制项,并且大多数仅需要设置一个整数值即可。 内核中已经为我们提供了这个控制类型的,我们只需要明确自己需要添加什么控制类型,然后将其添加进内核中即可。该部分摄像头代码一半厂家会提供驱动或者相对应的参数,否则没有图像处理知识很难开发出来。 返回总目录...

DSMGUOGUO的博客 1435

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1486

Android从零开发之下载文件时显示进度条-AsyncTask的应用

教你如何实现Android下载文件同时显示一个进度条 这里介绍下如何用Android模拟器去创建一个sdcard,并且学习在Android中去下载一个网上的文件保存到sdcard中,同时在Android下载文件的时候会显示一个进度条。这些就是我们这一篇代码要实  这里介绍下如何用Android模拟器去创建一个sdcard,并且学习在Android中去下载一个网上的文件保存到sdca

1100

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。

智慧空间实验室 2073

android 更新并安装应用

使用xutils.jar,  android 5.0以上版本使用xutils2.6.14.jar以上版本。 private ProgressDialog progressDialog = null; //下载更新apk private void downloadAPK(String url,String version) { Log.d("下载地址",u

Zhang_hongchao的博客 459

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

网络下载 并保存

Android实现下载图片并保存到SD卡中 收藏 1.java代码,下载图片的主程序 先实现显示图片,然后点击下载图片按钮,执行下载功能。 view plaincopy to clipboardprint? 01.package com.min.android_test_2_3_3;  02.  03.import java.io.Buffere

530

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android多线程断点下载-带进度条和百分比进度显示

android多线程断点下载,带进度条和百分比显示,断点下载的临时数据保存到SD卡的文本文档中,建议可以保存到本地数据库中,这样可以提高存取效率,从而提高系统性能。 效果: 打开软件: 下载中: 下载完毕: 附代码如下: 1 package com.yy.multiDownloadOfBreakPoint; 2 3 import java.io.Fil...

weixin_30699831的博客 197

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

asynchttpclient(下载图片)

asynchttpclient - github地址: https://github.com/loopj/android-async-http使用的jar是 : android-async-http-1.4.8场景: 下载网络上的图片,保存到sd卡,并且使用通知栏显示下载的进度。 可以中断下载任务(没找到暂停的功能)效果Mainactivitypackage com.example

冬眠FF的博客 1427

Qt5.8用HTTP实现文件上传和下载(带进度条)

Qt5.8用HTTP实现文件上传和下载(带进度条)本文基于Qt5.8利用FTP协议实现文件的上传和下载。 本人所使用的HTTP服务器端的操作系统为Linux(Ubuntu),编写QT代码的客户端的操作系统为Windows.重要声明: 由于QT5.4版本之前和之后所提供的的类的差别非常大,所以请参考本文的读者确保您自己的Qt版本>=5.4。我们主要使用的类QNetWorkAccessManager从5

Informaticien trilingue的博客 2万+

android-关于下载网络资源以及写入到SD卡中

今天下载网络资源的写法。首先,相关的类有:URL,HttpURLConnection 如何获取网络资源的输入流?见代码: url = new URL(urlStr); HttpURLConnection urlconn = (HttpURLConnection)url.openConnection();

juetion的专栏 1472

android简单实现从网络下载文件到手机sd卡

首先,要明确这个程序大概的流程: 1:从Activity中创建要下载的文件实体信息,然后传入到service中进行下载,在service中是主线程,必须另外开启子线程进行下载。 2:将在子线程中下载的时候将下载的进度传回到activity中进行更新ui 一:先讲解MainActivity 初始化界面控件,然后添加相应的点击事件,stop按钮的逻辑暂未实现 首先创建了一个FileI

Growth的博客 1787

Android代码实现文件下载

import android.os.Environment; import androidx.annotation.NonNull; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; .

跟踪世界脚步 3179
上一篇: 从网络中下载图片并进行显示
下一篇: EditText+ListView实时刷新ListView
一giao窝里giao
博客等级 码龄11年 37粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值