android自更新时下载出现的问题

之前做过一个电视台app,电视台app每次启动时会访问服务器,判断是否需要下载新版本

但是下载时老是下载失败,apk包总是下载不下来.到底是什么原因呢?

服务器下载接口如下:

Java代码  

  1. /*** 
  2.      * 下载apk 
  3.      * @param path 
  4.      * @param request 
  5.      * @return 
  6.      * @throws IOException 
  7.      */  
  8.     @RequestMapping(value = "/download"/*, headers = {"content-type=application/json"}*/)  
  9.     public ResponseEntity<byte[]> download( String path,HttpServletRequest request) throws IOException {  
  10.         AccessLog accessLog=logInto(request);  
  11.         accessLog.setDescription("下载客户端");  
  12.         if(!ValueWidget.isNullOrEmpty(request.getContentType())&& request.getContentType().toLowerCase().contains("application/json")){  
  13.             String requestStr=WebServletUtil.getRequestQueryStr(request, null);  
  14.             System.out.println(requestStr);  
  15.             Map queryMap=JSONPUtil.getMapFromJson(requestStr);  
  16.             if(!ValueWidget.isNullOrEmpty(queryMap)){  
  17.                 path=(String) queryMap.get("path");  
  18.             }  
  19.         }  
  20.         if(ValueWidget.isNullOrEmpty(path)){  
  21.             System.out.println("download failed");  
  22.             accessLog.setOperateResult("下载失败,没有传递path参数");  
  23.             logSave(accessLog, request);  
  24.             return null;  
  25.         }  
  26.         String realpath =WebServletUtil.getUploadPath(request, "upload/download/apk", request  
  27.                 .getSession().getServletContext(), Constant2.SRC_MAIN_WEBAPP);  
  28.         if(!realpath.endsWith(File.separator)){  
  29.             realpath=realpath+File.separator;  
  30.         }  
  31.         HttpHeaders headers = new HttpHeaders();  
  32.         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);  
  33.         String fullpath=realpath+path;  
  34.           
  35.         System.out.println("download path:"+fullpath);  
  36.         headers.set(Constant2.CONTENT_DISPOSITION,WebServletUtil.getContentDisposition(true, path));  
  37.         accessLog.setOperateResult("下载成功,下载文件:"+fullpath+" ,size:"+FileUtils.getFileSize2(fullpath));  
  38.         logSave(accessLog, request);  
  39.         return new ResponseEntity<byte[]>(FileUtils.getBytes4File(fullpath),  
  40.                                           headers, HttpStatus.CREATED);  
  41.     }  

 

安卓端调用的下载方法(核心代码)如下:

Java代码  

  1. /*** 
  2.      *  
  3.      * @param huc 
  4.      * @param sendBytes 
  5.      * @param mode 
  6.      * @param isWrite2file 
  7.      *            : 是否写入文件 
  8.      * @return 
  9.      * @throws Exception 
  10.      */  
  11.     private static byte[] connection(HttpURLConnection huc,  
  12.             boolean isWrite2file, Object file, String sizeHeadKey)  
  13.             throws Exception {  
  14.         int resCode = huc.getResponseCode();  
  15.   
  16.         if (resCode == HttpURLConnection.HTTP_OK) {  
  17.             int contentLength = 0;  
  18.             if (ValueWidget.isNullOrEmpty(sizeHeadKey)) {// 若header中没有size  
  19.                 contentLength = huc.getContentLength();  
  20.             } else {  
  21.                 String sizeHeaderValue = huc.getHeaderField(sizeHeadKey);  
  22.                 if (!ValueWidget.isNullOrEmpty(sizeHeaderValue)) {  
  23.                     contentLength = Integer.parseInt(sizeHeaderValue);  
  24.                 }  
  25.   
  26.             }  
  27.             if (isDetail) {  
  28.                 System.out  
  29.                         .println("[connection]contentLength:" + contentLength);  
  30.                 responseHeaderFields = huc.getHeaderFields();  
  31.                 String downloadHeader = "Content-Disposition";  
  32.                 if (!ValueWidget.isNullOrEmpty(responseHeaderFields)) {  
  33.                     List<String> ContentDispositions = responseHeaderFields  
  34.                             .get(downloadHeader);  
  35.                     if (!ValueWidget.isNullOrEmpty(ContentDispositions)) {  
  36.                         String ContentDisposition = ContentDispositions.get(0);  
  37.                         System.out.println("ContentDisposition:"  
  38.                                 + ContentDisposition);  
  39.                         System.out.println("ContentDisposition convertISO2UTF:"  
  40.                                 + SystemHWUtil  
  41.                                         .convertISO2UTF(ContentDisposition));  
  42.                         System.out  
  43.                                 .println("ContentDisposition convertISO2GBK: "  
  44.                                         + SystemHWUtil  
  45.                                                 .convertISO2GBK(ContentDisposition));  
  46.                     }  
  47.                 }  
  48.                 for (Object obj : responseHeaderFields.keySet()) {  
  49.                     List<String> list = responseHeaderFields.get(obj);  
  50.                     if (!ValueWidget.isNullOrEmpty(list)) {  
  51.                         System.out.println(obj + " : "  
  52.                                 + SystemHWUtil.formatArr(list, ";"));  
  53.                     }  
  54.                 }  
  55.                 System.out  
  56.                         .println("[connection]contentLength:" + contentLength);  
  57.             }  
  58.             if (contentLength > 0) {  
  59.                 if (isDetail)  
  60.                     System.out  
  61.                             .println("[HttpSocketUtil.connection]httputil,contentLength:"  
  62.                                     + contentLength);  
  63.                 // return readData(huc);  
  64.                 File file2 = null;  
  65.                 if (isWrite2file) {  
  66.                     if (file instanceof File) {  
  67.                         file2 = (File) file;  
  68.                         writeFileFromLength(huc, contentLength, file2);  
  69.                         if (isDetail) {  
  70.                             System.out.println("download success:"  
  71.                                     + file2.getAbsolutePath());  
  72.                         }  
  73.                     } else {  
  74.                         writeFileFromLength(huc, contentLength,  
  75.                                 (OutputStream) file);  
  76.                     }  
  77.                     return null;  
  78.                 } else {  
  79.                     return readDataFromLength(huc, contentLength);  
  80.                 }  
  81.             } else {  
  82.                 if (isWrite2file) {  
  83.                     InputStream in = huc.getInputStream();  
  84.                     FileUtils.writeIn2OutputCloseAll(in, new FileOutputStream(  
  85.                             (File) file));  
  86.                     if (isDetail) {  
  87.                         System.out.println("download success:"  
  88.                                 + ((File) file).getAbsolutePath());  
  89.                     }  
  90.                     return null;  
  91.                 }  
  92.                 return readData(huc);  
  93.             }  
  94.         } else {  
  95.             System.out.println("response Code:" + resCode);  
  96.         }  
  97.         return null;  
  98.     }  

 

代码本身是没有逻辑错误的.花了很长时间才找到原因,是定义的response的status code不一致.


 

 

后台设置的status code是201,而Android端判断的status code是200,不一致导致下载流程没有走到下载逻辑.

修改方法:把后台的status code改为200 就OK了

时间: 2024-10-03 19:35:35

android自更新时下载出现的问题的相关文章

Android程序更新时 调用安装APK

问题描述 做了一个程序,可以更新版本.更新版本的时候 要安装. 怎么调用 apk安装程序 ? 解决方案 兄弟,你可以参见我的一篇博客,估计就是你要的:http://rainbow702.iteye.com/blog/1168391

Android编程实现应用自动更新、下载、安装的方法_Android

本文实例讲述了Android编程实现应用自动更新.下载.安装的方法.分享给大家供大家参考,具体如下: 我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新.得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下. 1. 准备知识 在AndroidManifest.xml里定义了每个Android apk的版本标识: <manifest xmlns:android="http://schemas.android.com/a

Android SDK Manager解决更新时的问题 :Failed to fetch URL..._Android

         Failed to fectch URl https://dl-ssl.google.com/android/repository/addons_list.xml, reason: Connection to https://dl-ssl.google.com refused        安装使用SDK Manager更新时出现问题 Failed to fetch URL  https://dl-ssl.google.com/android/repository/reposi

Android编程实现应用自动更新、下载、安装的方法

本文实例讲述了Android编程实现应用自动更新.下载.安装的方法.分享给大家供大家参考,具体如下: 我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新.得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下. 1. 准备知识 在AndroidManifest.xml里定义了每个Android apk的版本标识: <manifest xmlns:android="http://schemas.android.com/a

二进制-Android从FTP服务器下载文件时由传输模式引起的问题

问题描述 Android从FTP服务器下载文件时由传输模式引起的问题 从FTP服务器下载windows系统下编写的二进制文件,下载发现总是少几个字节,后来发现是因为windows系统下换行是0D0A两个字节,而在Unix系统下只有0A一个字节,百度到需要把ftp的传输模式设置为二进制格式,我也按照网上的方法设置了,但是下载文件的这个问题仍然存在,求好心的大神帮帮忙,谢谢! 解决方案 下载FTP服务器上文件java 代码之FTP服务器下载文件从FTP服务器下载文件 解决方案二: 额,这个问题我自己

体验极速Android SDK的更新与下载

原文:体验极速Android SDK的更新与下载 首先:国内明确一点,国内由于天朝限制了google,更新和下载Android相关资料都比较吃力,因此,本文正式宣告,此问题不再是问题-------别说话,吻我 先给点福利: 关于java(Android)相关资料比较全资料站点: 1.http://tools.android-studio.org/index.php 2.http://www.androiddevtools.cn/   开始更新我们的Android sdk了 使用方法: 启动 An

Android应用程序更新并下载实例

整理文档,搜刮出一个Android应用程序更新并下载实例的代码,稍微整理精简一下做下分享. 创建一个新类,名为UpdateManager,代码如下: import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;

《Android应用开发攻略》——1.12 保持Android SDK更新

1.12 保持Android SDK更新 Daniel Fowler1.12.1 问题 SDK必须保持更新,使应用开发人员能够使用不断发展的Android平台上的最新API.1.12.2 解决方案 使用Android SDK Manager程序更新已安装的SDK包和安装新SDK包,包括用于设备特殊功能的第三方程序包.1.12.3 讨论 Android操作系统不断发展,因此,Android SDK也随之发展.Android持续发展的驱动力是: Google的研究和开发 手机制造商开发新的改进型手机

Android SDK更新以及ADT更新出现问题的解决办法

Android SDK更新以及ADT更新出现问题的解决办法     在Android来发过程中我们经常会遇到有关SDK和ADT的更新问题,有时候会很棘手,很难解决,下面就奉上问题的解决方案.   问题描述 使用SDK Manager更新时出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google