首页 > 代码库 > 使用SAE的Storage来为Android应用提供版本更新的检查和下载功能

使用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     }