zoukankan      html  css  js  c++  java
  • 使用SAE的Storage来为Android应用提供版本更新的检查和下载功能

    因为Android的市场比较分散,有时候上传和审核都麻烦。为了让用户能第一时间获得更新,接下来要实现版本检查和下载功能。
    先在Storage里放入应用的APK、一个json的文档或者xml文件,因为我比较喜欢用json,所以接下来就用json文档。写json文档的时候记得不要用记事本,要用Notepad++之类的文本编辑器来写,然后保存成UTF-8无BOM的格式。不然android4.0以下版本解析会有问题。更新数据的格式:
    {
          "version": 10,
          "message": "1.更新信息1 2.更新信息2 3.更新信息3 4.更新信息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     }
  • 相关阅读:
    RCU介绍
    采用dlopen、dlsym、dlclose加载动态链接库
    linux获取系统启动时间
    Linux获取进程执行时间
    linux下获取硬盘使用情况
    linux下判断文件和目录是否存在
    孤儿进程与僵尸进程
    多个文件目录下Makefile的写法
    System V 共享内存区
    Posix共享内存区
  • 原文地址:https://www.cnblogs.com/zhengxt/p/3760388.html
Copyright © 2011-2022 走看看