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

 更新时间:2018年12月24日 10:08:11   作者:pigdreams  
今天小编就为大家分享一篇关于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(); 
  } 
} 

总结

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

相关文章

  • Android开发之滑动数值选择器NumberPicker用法示例

    Android开发之滑动数值选择器NumberPicker用法示例

    这篇文章主要介绍了Android开发之滑动数值选择器NumberPicker用法,结合实例形式分析了Android滑动数值选择器NumberPicker的功能、相关函数、事件监听、界面布局等操作技巧,需要的朋友可以参考下
    2019-03-03
  • Jetpack Compose 实现一个图片选择框架功能

    Jetpack Compose 实现一个图片选择框架功能

    这篇文章主要介绍了Jetpack Compose 实现一个图片选择框架,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 详解Flutter扫码识别二维码内容

    详解Flutter扫码识别二维码内容

    这篇文章主要介绍了Flutter扫码识别二维码内容的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Android编程实现滑动开关组件功能【附源码下载】

    Android编程实现滑动开关组件功能【附源码下载】

    这篇文章主要介绍了Android编程实现滑动开关组件功能,结合实例形式详细分析了Android滑动开关组件的简单布局与功能实现技巧,并附带完整实例源码供读者下载参考,需要的朋友可以参考下
    2018-01-01
  • Android自定义view Path 的高级用法之搜索按钮动画

    Android自定义view Path 的高级用法之搜索按钮动画

    这篇文章主要介绍了Android自定义view Path 的高级用法之搜索按钮动画,需要的朋友可以参考下
    2017-06-06
  • Android编程实现启动界面的方法分析

    Android编程实现启动界面的方法分析

    这篇文章主要介绍了Android编程实现启动界面的方法,结合实例形式分析了Android启动界面的实现方法与相关操作技巧,需要的朋友可以参考下
    2017-03-03
  • Android自定义View实现随机数验证码

    Android自定义View实现随机数验证码

    这篇文章主要为大家详细介绍了Android如何利用自定义View实现随机数验证码效果,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-06-06
  • Android屏幕旋转 处理Activity与AsyncTask的最佳解决方案

    Android屏幕旋转 处理Activity与AsyncTask的最佳解决方案

    运行时变更就是设备在运行时发生变化(例如屏幕旋转、键盘可用性及语言)。发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务,以便恢复activity的状态。为此,google提供了三种解决方案,本文将对这三种方案进行逐一介绍。
    2016-12-12
  • Android实现缩放动画

    Android实现缩放动画

    这篇文章主要为大家详细介绍了Android实现缩放动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • android使用ItemDecoration给RecyclerView 添加水印

    android使用ItemDecoration给RecyclerView 添加水印

    本篇文章主要介绍了android使用ItemDecoration给RecyclerView 添加水印,介绍了自定义Drawable来完成水印图片和使用ItemDecoration来布局水印,有兴趣的可以了解一下。
    2017-02-02

最新评论