热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

今天小编就为大家分享一篇关于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(); 
  } 
} 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接


推荐阅读
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 使用Echarts for Weixin 小程序实现中国地图及区域点击事件
    本文介绍了如何使用Echarts for Weixin在微信小程序中构建中国地图,并实现区域点击事件。包括效果展示、条件准备和逻辑实现的具体步骤。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文介绍如何在阿里云环境中利用 Docker 容器化技术部署一个简单的 Flask Web 应用,并确保其可通过互联网访问。内容涵盖 Python 代码编写、Dockerfile 配置、镜像构建及容器运行等步骤。 ... [详细]
  • 深入理解Dockerfile及其作用
    Dockerfile是一种文本格式的配置文件,用于定义构建Docker镜像所需的步骤。通过使用`docker build`命令,用户可以将Dockerfile中的一系列指令转换成一个可执行的Docker镜像。 ... [详细]
  • 2017年软件开发领域的七大变革
    随着技术的不断进步,2017年对软件开发人员而言将充满挑战与机遇。本文探讨了开发人员需要适应的七个关键变化,包括人工智能、聊天机器人、容器技术、应用程序版本控制、云测试环境、大众开发者崛起以及系统管理的云迁移。 ... [详细]
  • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
  • 将字符串中的嵌套列表转换回嵌套列表 ... [详细]
  • 本文将探讨如何在 Struts2 中使用 ActionContext 和 ServletActionContext 来获取请求参数和会话信息,同时解释它们的内部机制和最佳实践。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 本文介绍了存储器的基本原理及其分类,包括不同类型的存储介质和存储方式,并详细解释了各种存储器的特点和应用场景。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
author-avatar
手机用户2502904377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有