使用SAE的Storage来为Android应用提供版本更新的检查和下载功能
因为Android的市场比较分散,有时候上传和审核都麻烦。为了让用户能第一时间获得更新,接下来要实现版本检查和下载功能。
先在Storage里放入应用的APK、一个json的文档或者xml文件,因为我比较喜欢用json,所以接下来就用json文档。写json文档的时候记得不要用记事本,要用Notepad++之类的文本编辑器来写,然后保存成UTF-8无BOM的格式。不然android4.0以下版本解析会有问题。更新数据的格式:
{
"version": 10,
"message": "1.更新信息1\n2.更新信息2\n3.更新信息3\n4.更新信息4",
"dowload": "http://****.sinaapp.com/FileDownload?filename=newfile.apk"
}
让Android端去读取Storage的json文档里面记录着,应用的最新版本号、本次更新的内容、下载地址。然后解析json拿到数据,再对比应用的当前版本看是否需要更新。
Android端的代码:
1 class CheckedUpdate extends AsyncTask<String, Integer, String> { 2 protected String doInBackground(String... params) { 3 ByteArrayOutputStream baos = null; 4 InputStream ips = null; 5 String str = ""; 6 baos = new ByteArrayOutputStream(); 7 try { 8 // 建立一个byte数组作为缓冲区,等下把读取到的数据储存在这个数组 9 byte[] buffer = new byte[1024]; 10 int len = 0; 11 URL url = new URL("http://****.sinaapp.com/Download?filename=version.json"); 12 HttpURLConnection huc = (HttpURLConnection) url.openConnection(); 13 // GET请求方式 14 huc.setRequestMethod("GET"); 15 // 设置读取超时 16 huc.setReadTimeout(10000); 17 // 设置连接超时 18 huc.setConnectTimeout(3000); 19 // 获得输入流 20 ips = huc.getInputStream(); 21 // 拿到服务器返回的响应码 22 int hand = huc.getResponseCode(); 23 if (hand == 200) { 24 // 读取数据 25 while ((len = ips.read(buffer)) != -1) { 26 baos.write(buffer, 0, len); 27 } 28 str = new String(baos.toByteArray(), "UTF-8"); 29 } else { 30 Log.w(TAG, "服务器返回码" + hand); 31 } 32 } catch (ProtocolException e) { 33 e.printStackTrace(); 34 } catch (MalformedURLException e) { 35 e.printStackTrace(); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } finally { 39 try { 40 if (baos != null) { 41 baos.close(); 42 } 43 if (ips != null) { 44 ips.close(); 45 } 46 } catch (IOException e) { 47 e.printStackTrace(); 48 } 49 } 50 return str; 51 } 52 53 protected void onPreExecute() { 54 Toast.makeText(context, "正在联网检查中", Toast.LENGTH_SHORT).show(); 55 } 56 protected void onPostExecute(String result) { 57 int version = 0; 58 String message = ""; 59 String dowload = ""; 60 if (TextUtils.isEmpty(result)) 61 return; 62 try { 63 JSONObject jsonObject = new JSONObject(result); 64 version = jsonObject.getInt("version"); 65 // 获得应用的当前版本 66 PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); 67 // 如果大于当前版本则下载新应用的APK 68 if (version > packageInfo.versionCode) { 69 message = jsonObject.getString("message"); 70 dowload = jsonObject.getString("dowload"); 71 // 弹出对话框询问是否更新 72 setDialog(message, dowload); 73 } else { 74 Toast.makeText(context, "已经是最新版本了", Toast.LENGTH_LONG).show(); 75 } 76 } catch (NameNotFoundException e) { 77 e.printStackTrace(); 78 } catch (JSONException e) { 79 e.printStackTrace(); 80 } 81 } 82 }
下面是通过服务端获得Storage里存放文件的方法。
服务器端的代码:
1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 SaeStorage storage = new SaeStorage(); 3 String domain = "domainname"; 4 String fileName = request.getParameter("filename"); 5 boolean isFile = storage.fileExists("updatafile", fileName); 6 // 文件是否存在 7 if(isFile){ 8 String url = storage.getUrl(domain, fileName); 9 response.sendRedirect(url); 10 }else{ 11 response.getWriter().write("Not Found"); 12 } 13 }