`

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

    博客分类:
  • Java
阅读更多

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

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

服务器下载接口如下:

/***
	 * 下载apk
	 * @param path
	 * @param request
	 * @return
	 * @throws IOException
	 */
	@RequestMapping(value = "/download"/*, headers = {"content-type=application/json"}*/)
    public ResponseEntity<byte[]> download( String path,HttpServletRequest request) throws IOException {
    	AccessLog accessLog=logInto(request);
		accessLog.setDescription("下载客户端");
    	if(!ValueWidget.isNullOrEmpty(request.getContentType())&& request.getContentType().toLowerCase().contains("application/json")){
	    	String requestStr=WebServletUtil.getRequestQueryStr(request, null);
	    	System.out.println(requestStr);
	    	Map queryMap=JSONPUtil.getMapFromJson(requestStr);
	    	if(!ValueWidget.isNullOrEmpty(queryMap)){
	    		path=(String) queryMap.get("path");
	    	}
    	}
    	if(ValueWidget.isNullOrEmpty(path)){
    		System.out.println("download failed");
    		accessLog.setOperateResult("下载失败,没有传递path参数");
    		logSave(accessLog, request);
    		return null;
    	}
    	String realpath =WebServletUtil.getUploadPath(request, "upload/download/apk", request
				.getSession().getServletContext(), Constant2.SRC_MAIN_WEBAPP);
    	if(!realpath.endsWith(File.separator)){
    		realpath=realpath+File.separator;
    	}
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        String fullpath=realpath+path;
        
        System.out.println("download path:"+fullpath);
        headers.set(Constant2.CONTENT_DISPOSITION,WebServletUtil.getContentDisposition(true, path));
        accessLog.setOperateResult("下载成功,下载文件:"+fullpath+" ,size:"+FileUtils.getFileSize2(fullpath));
		logSave(accessLog, request);
        return new ResponseEntity<byte[]>(FileUtils.getBytes4File(fullpath),
                                          headers, HttpStatus.CREATED);
    }

 

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

/***
	 * 
	 * @param huc
	 * @param sendBytes
	 * @param mode
	 * @param isWrite2file
	 *            : 是否写入文件
	 * @return
	 * @throws Exception
	 */
	private static byte[] connection(HttpURLConnection huc,
			boolean isWrite2file, Object file, String sizeHeadKey)
			throws Exception {
		int resCode = huc.getResponseCode();

		if (resCode == HttpURLConnection.HTTP_OK) {
			int contentLength = 0;
			if (ValueWidget.isNullOrEmpty(sizeHeadKey)) {// 若header中没有size
				contentLength = huc.getContentLength();
			} else {
				String sizeHeaderValue = huc.getHeaderField(sizeHeadKey);
				if (!ValueWidget.isNullOrEmpty(sizeHeaderValue)) {
					contentLength = Integer.parseInt(sizeHeaderValue);
				}

			}
			if (isDetail) {
				System.out
						.println("[connection]contentLength:" + contentLength);
				responseHeaderFields = huc.getHeaderFields();
				String downloadHeader = "Content-Disposition";
				if (!ValueWidget.isNullOrEmpty(responseHeaderFields)) {
					List<String> ContentDispositions = responseHeaderFields
							.get(downloadHeader);
					if (!ValueWidget.isNullOrEmpty(ContentDispositions)) {
						String ContentDisposition = ContentDispositions.get(0);
						System.out.println("ContentDisposition:"
								+ ContentDisposition);
						System.out.println("ContentDisposition convertISO2UTF:"
								+ SystemHWUtil
										.convertISO2UTF(ContentDisposition));
						System.out
								.println("ContentDisposition convertISO2GBK: "
										+ SystemHWUtil
												.convertISO2GBK(ContentDisposition));
					}
				}
				for (Object obj : responseHeaderFields.keySet()) {
					List<String> list = responseHeaderFields.get(obj);
					if (!ValueWidget.isNullOrEmpty(list)) {
						System.out.println(obj + " : "
								+ SystemHWUtil.formatArr(list, ";"));
					}
				}
				System.out
						.println("[connection]contentLength:" + contentLength);
			}
			if (contentLength > 0) {
				if (isDetail)
					System.out
							.println("[HttpSocketUtil.connection]httputil,contentLength:"
									+ contentLength);
				// return readData(huc);
				File file2 = null;
				if (isWrite2file) {
					if (file instanceof File) {
						file2 = (File) file;
						writeFileFromLength(huc, contentLength, file2);
						if (isDetail) {
							System.out.println("download success:"
									+ file2.getAbsolutePath());
						}
					} else {
						writeFileFromLength(huc, contentLength,
								(OutputStream) file);
					}
					return null;
				} else {
					return readDataFromLength(huc, contentLength);
				}
			} else {
				if (isWrite2file) {
					InputStream in = huc.getInputStream();
					FileUtils.writeIn2OutputCloseAll(in, new FileOutputStream(
							(File) file));
					if (isDetail) {
						System.out.println("download success:"
								+ ((File) file).getAbsolutePath());
					}
					return null;
				}
				return readData(huc);
			}
		} else {
			System.out.println("response Code:" + resCode);
		}
		return null;
	}

 

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



 

 

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

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

 

  • 大小: 32.8 KB
  • 大小: 46.9 KB
0
0
分享到:
评论

相关推荐

    Delphi XE android 自动 在线更新升级APP,然后自动安装的代码实现

    Delphi XE android 更新 升级 自动 在线更新升级APP 然后自动安装的代码实现

    Android SDK开发包国内官网下载地址.pdf

    为了预防今后再出现这样的情况,这次干脆把android开发所需要的各种包总结一下,顺便提供本地下载链接,省得以后找起来麻烦。 通过分析SDK Manager里要用到的repository文件,我下载了目前google提供的各类安卓开发...

    android ADT 23.00

    问题描述:Android SDK更新后,打开Eclipse软件时,出现This Android SDK requires Android Developer Toolkit version 23.0.0 or above提示,意思是该SDK需要ADT(Android Developer Toolkit)23.0.0或以上版本。...

    Android高级编程--源代码

    3.6.5 运行时配置更改 62 3.7 深入探讨Android活动 63 3.7.1 创建一个活动 63 3.7.2 活动生命周期 65 3.7.3 Android活动类 70 3.8 小结 70 第4章 创建用户界面 73 4.1 Android UI基本设计 74 4.2 View简介 ...

    Android ThinkAndroid开发框架.zip

    具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能, 在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。...

    Android 常用六大框架

    (4) 图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。 FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,...

    Android 热更新——非侵入AOP框架

    针对Android平台,Dexposed支持函数级别的在线热更新,例如对已经发布在应用市场上的宿主APK,当我们从crash统计平台上发现某个函数调用有bug,导致经常性crash,这时,可以在本地开发一个补丁APK,并发布到服务器中...

    AndroidStudio开发疑难问题30/100问(更新中)

    1、为什么模拟器创建完了无法运行? 2、为什么执行install.exe无法弹...10、导入项目出现修改SDK path的提示如何处理? 11、The project is using an incompatible version (AGP 8.2.0) of the Android Gradle plugin. La

    Android开发之自带下载器DownloadManager的使用示例代码

    Android 开发中,经常有从服务器下载数据的需求出现,尤其是在线更新App的情形。其基本思路是根据本地的App版本号和服务器的版本号进行比较,如果服务器版本较新,再进行提示然后下载Apk最后进行安装。这种需求解决...

    ADT-23.0.0.part2

    问题描述:Android SDK更新后,打开Eclipse软件时,出现This Android SDK requires Android Developer Toolkit version 23.0.0 or above提示,意思是该SDK需要ADT(Android Developer Toolkit)23.0.0或以上版本。...

    Android sdk 以及相应的eclipse一整套 eclipse分卷二(共五卷)

    3.(重点)在Eclipse中--》窗口--》首选项--》Android--》SDK Location浏览到刚刚解压的sdk目录里面 就可以了--》确定--》重启Eclipse 然后出来就可以更新了。就会出现两个图标。选第一个下载你需要的版本,一把下载...

    Android M (6.0)官方源码(完整版)

    Android M (6.0)官方源码整版,从已更新完的SDK Manager中拷出来的,课供参考和学习,Android 6.0也加入了一些新控件,和指纹等信息的进步,同时还有新特效的出现,源码课拷贝至自己的项目中运行哦!

    Android使用IntentService进行apk更新示例代码

    通常在使用service更新应用时最常出现的问题就是Notification进度的更新问题、service在什么时间关闭以及需要我们自己在Service中创建新的线程处理耗时操作,当然这种也是可以实现的但是会显得略微繁琐 经过对比...

    Android sdk 以及相应的eclipse一整套 eclipse分卷三(共五卷)

    3.(重点)在Eclipse中--》窗口--》首选项--》Android--》SDK Location浏览到刚刚解压的sdk目录里面 就可以了--》确定--》重启Eclipse 然后出来就可以更新了。就会出现两个图标。选第一个下载你需要的版本,一把下载...

    Android 应用数据库升级方法.docx

    应用的更新有两种情况,一是系统应用随着系统OTA更新,二是用户从市场上单独更新app。...否则,更新后的应用访问数据库时,访问的是更新前的代码建立的数据库,会出现NoSuchColumnException,导致应用FC。

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

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

    解决Android SDK下载和更新失败的方法详解

    最近刚换了电脑,开始搭建Android开发环境的时候,下载SDK总是会出现如下错误: 代码如下: Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml. 说dl-ssl.google.com在大陆被强...

    ADT-23.0.0.part3

    问题描述:Android SDK更新后,打开Eclipse软件时,出现This Android SDK requires Android Developer Toolkit version 23.0.0 or above提示,意思是该SDK需要ADT(Android Developer Toolkit)23.0.0或以上版本。...

Global site tag (gtag.js) - Google Analytics