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


猜你喜欢
- 命名空间提供了一种从逻辑上组织类的方式,防止命名冲突。几种常见语言C++命名空间是可以嵌套的嵌套的命名空间是指定义在其他命名空间中的命名空间
- 混乱的URI编码 JavaScript中编码有三种方法:escape、encodeURI、encodeURIComponent C#中编码主
- 群主发普通红包,某群有多名成员,群主给成员发普通红包,普通红包的规则:群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取;成员领取
- 一、背景在我们编写程序的过程中,程序中可能随时发生各种异常,那么我们如何优雅的处理各种异常呢?二、需求1、拦截系统中部分异常,返回自定义的响
- 用来练手还是不错的,分享大家看一下,还是一些新颖点的!哈哈 就是自定义DataGridView,方便每个功能部分调用!简单!再次重
- 实现思路其实很简单,就是一个自定义的LinearLayout,并且textView能够循环垂直滚动,而且条目可以点击,显示区域最多显示2个条
- 概述本文的目的是实现以下的流程:Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或
- 其实很简单,就是把我们的数据库文件放到我们的手机里,所以不必局限在哪个地方写这个代码,在第一次创建数据库的时候可以,我觉得在软件起动页里效果
- poi解析Excel文件版本问题解决办法poi解析Excel文件时有两种格式: HSSFWorkbook格式用来解析Excel2003(xl
- 前言在Android屏幕的空间中,大部分的区域我们都是可以随意绘制,只有一部分区域是显示的固定内容:状态栏标题栏(ActionBar)页面内
- SWT中没有AWT的BorderLayout布局管理器。下面是SWT下的自定义实现: BorderLayout.java package s
- 进入到Android-sdk中platform-tools目录在命令行中执行以下命令adb shell dumpsys activity&g
- 一、Bundle进行IPC介绍四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bund
- 前言这篇博客介绍Java环境的配置,主要是安装JDK,以及path、JAVA_hOME、CLASSPAT的配置,还会介绍配置这些的原因。一.
- 前言:回顾上一节服务器配置的内容,我们已经可以自己完成公众号服务器的配置。配置完成之后,我们就可以通过调用的方式,完成对消息管理的处理。当用
- 本文实例讲述了Android开发中4个常用的工具类。分享给大家供大家参考,具体如下:1、土司工具类(Toast管理)/** * Toast统
- 实践仿照@EnableEurekaServer实现自动装配如果你使用过Eureka作为微服务的注册中心,那么对@EnableWebConfi
- 使用enum进行定义/*枚举类型演示*/#include <stdio.h>int main() { enum /*
- 运行下面这段代码,观察其结果:package com.test;public class HelloB extends HelloA {pu
- 前言在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.O