Android实现简单的文件下载与上传
作者:pigdreams 发布时间:2022-02-25 00:00:14
标签:android,文件,下载,上传
文件下载
/**
* 下载服务 IntentService
* 生命周期:
* 1>当第一次启动IntentService时,Android容器
* 将会创建IntentService对象。
* 2>IntentService将会在工作线程中轮循消息队列,
* 执行每个消息对象中的业务逻辑。
* 3>如果消息队列中依然有消息,则继续执行,
* 如果消息队列中的消息已经执行完毕,
* IntentService将会自动销毁,执行onDestroy方法。
*/
public class DownloadService extends IntentService{
private static final int NOTIFICATION_ID = 100;
public DownloadService(){
super("download");
}
public DownloadService(String name) {
super(name);
}
/**
* 该方法中的代码将会在工作线程中执行
* 每当调用startService启动IntentService后,
* IntentService将会把OnHandlerIntent中的
* 业务逻辑放入消息队列等待执行。
* 当工作线程轮循到该消息对象时,将会
* 执行该方法。
*/
protected void onHandleIntent(Intent intent) {
//发送Http请求 执行下载业务
//1. 获取音乐的路径
String url=intent.getStringExtra("url");
String bit=intent.getStringExtra("bit");
String title=intent.getStringExtra("title");
//2. 构建File对象,用于保存音乐文件
// /mnt/sdcard/Music/_64/歌名.mp3
File targetFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC),"_"+bit+"/"+title+".mp3" );
if(targetFile.exists()){
Log.i("info", "音乐已存在");
return;
}
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdirs();
}
try {
sendNotification("音乐开始下载", "音乐开始下载");
//3. 发送Http请求,获取InputStream
InputStream is = HttpUtils.getInputStream(url);
//4. 边读取边保存到File对象中
FileOutputStream fos = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024*100];
int length=0;
int current = 0;
int total = Integer.parseInt(intent.getStringExtra("total"));
while((length=is.read(buffer)) != -1){
fos.write(buffer, 0, length);
fos.flush();
current += length;
//通知下载的进度
double progress = Math.floor(1000.0*current/total)/10;
sendNotification("音乐开始下载", "下载进度:"+progress+"%");
}
//5. 文件下载完成
fos.close();
cancelNotification(); //重新出现滚动消息
sendNotification("音乐下载完成", "音乐下载完毕");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发通知
*/
public void sendNotification(String ticker, String text){
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("音乐下载")
.setContentText(text)
.setTicker(ticker);
Notification n = builder.build();
manager.notify(NOTIFICATION_ID, n);
}
/**
* 取消通知
*/
public void cancelNotification(){
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(NOTIFICATION_ID);
}
}
文件上传
/**
* 上传文件
* @param uploadFile
*/
private void uploadFile(final File uploadFile) {
new Thread(new Runnable() {
@Override
public void run() {
try {
uploadbar.setMax((int)uploadFile.length());
String souceid = logService.getBindId(uploadFile);
String head = "Content-Length="+ uploadFile.length() + ";filename="+ uploadFile.getName() + ";sourceid="+
(souceid==null? "" : souceid)+"\r\n";
Socket socket = new Socket("192.168.1.78",7878);
OutputStream outStream = socket.getOutputStream();
outStream.write(head.getBytes());
PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());
String response = StreamTool.readLine(inStream);
String[] items = response.split(";");
String responseid = items[0].substring(items[0].indexOf("=")+1);
String position = items[1].substring(items[1].indexOf("=")+1);
if(souceid==null){//代表原来没有上传过此文件,往数据库添加一条绑定记录
logService.save(responseid, uploadFile);
}
RandomAccessFile fileOutStream = new RandomAccessFile(uploadFile, "r");
fileOutStream.seek(Integer.valueOf(position));
byte[] buffer = new byte[1024];
int len = -1;
int length = Integer.valueOf(position);
while(start&&(len = fileOutStream.read(buffer)) != -1){
outStream.write(buffer, 0, len);
length += len;
Message msg = new Message();
msg.getData().putInt("size", length);
handler.sendMessage(msg);
}
fileOutStream.close();
outStream.close();
inStream.close();
socket.close();
if(length==uploadFile.length()) logService.delete(uploadFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
来源:https://blog.csdn.net/pigdreams/article/details/52864867
0
投稿
猜你喜欢
- 本文实例讲述了C#统计C、C++及C#程序代码行数的方法。分享给大家供大家参考。具体如下:本文中的两个函数1)用于统计扩展名为 .h .c
- 本文实例讲述了C++求四个正整数最大公约数的方法。分享给大家供大家参考,具体如下:/** 作 者: 刘同宾* 完成日期:2012 年 11
- 一、自定义菜单的说明和按钮类型1、菜单说明1)自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。2)一级菜单最多4个汉字,二
- @PropertySource读取配置文件通过@Value参数注入有参数文件如下test.propertiesproject.author=
- 一个Maprduce程序主要包括三部分:Mapper类、Reducer类、执行类。Maven项目下所需依赖<dependencies&
- RestTemplate简介Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTem
- 前言本文将带您了解在 Flutter 中制作翻转卡片动画的两个完整示例。第一个示例从头开始实现,第二个示例使用第三方包。闲话少说,让我们动手
- 目录基本查询延迟查询属性类型筛选复合from子句多级排序分组联合查询-join合并-zip()分区(分页)并行linq取消长时间运行的并行l
- 线程组线程组可以批量管理线程和线程组对象。一级关联例子如下,建立一级关联。public class MyThread43 implement
- 最近在做项目的时候,一直用一个叫做API的东西,controller注解我会写,这个东西我也会用,但是我确实不知道这个东西是个什么,有点神奇
- 背景在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载。当然,在其他业务场景下,比如
- 一、添加依赖<!--SpringBoot使用Swagger2构建API文档的依赖--> <dep
- 一、统一全站字符编码通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题package me.gacl
- MediaQuery通常情况下,不会直接将MediaQuery当作一个控件,而是使用MediaQuery.of获取当前设备的信息,用法如下:
- 今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都是可以提取出来的,就自己把那些公共部分提出出来,以后如果要获取某部分的硬件信息就
- 目录前言1、创建一个控制台应用程序2、编写测试代码并分析3、总结前言对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很
- 由于对运算符重载不是多么理解诶,于是就百度了一下,结果发现一个解释很有趣的百度知道,分享看看。回答:+-*/这样的运算符重定义,比如你自定义
- 本文实例汇总了Java性能优化技巧。分享给大家供大家参考。具体分析如下:这里参考了些书籍,网络资源整理出来,适合于大多数Java应用在JAV
- mybatis update并非所有字段需要更新mybatis update需求:更新字段作为参数,未更新字段不传入解决办法<upda
- 具体代码如下所示:import java.io.File;public class Scan { public static v