Android使用xutils3框架实现应用程序内的检查更新下载服务器存放的新版APK文件

纵观现在的好多Android应用程序,应用本身都有检查更新的的功能,不用去应用市场下载更新。

今天来实现这个功能:(需要服务器的配合)

Demo的布局文件很简单:一个Button叫做“检查更新”。

java代码:

button的监听事件:(下面的代码在onCreate中就行)

ll_update.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View arg0) {
             checkUpdate();
        }
});

下面的nowVersion是获取你手机应用当前的版本名称:也是在onCreate方法中就行

try {
            PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
            nowVersion = packageInfo.versionName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

下面是检查服务器的apk的版本名称:

     /**
      * 下载更新,
      */
      protected void checkUpdate() {
          proDialogShow(LoginActivity.this, "正在查询...");
          RequestParams params = new RequestParams("url");//这个就是上面说的需要服务器配合的地方,需要服务器给一个接口,请求返回的字符串要包含新APK文件的版本名称,这样我们就可以跟当前的apk名称对比是否要更新
          x.http().get(params, new Callback.CommonCallback<String>() {
  
              @Override
              public void onCancelled(CancelledException arg0) {
 
              }
 
             @Override
             public void onError(Throwable arg0, boolean arg1) {
                 
                 PDialogHide();
                 System.out.println("提示网络错误");
              }
 
             @Override
            public void onFinished() {
 
             }

             @Override
             public void onSuccess(String arg0) {
                 PDialogHide();
                 try {
                     JSONObject object = new JSONObject(arg0);
                      boolean success = object.getBoolean("succee");
                      if (success) {
                        String desc = object.getString("desc");//版本描述
                        String downloadurl = object.getString("downloadurl");//新版本更新地址
                         String versionname = object.getString("versionname");//新版本名称
                         if (nowVersion.equals(versionname)) {
                             System.out.println("当前版本为最新,不用跟新");
                         } else {
                             // 不同,弹出更新提示对话框
                             setUpDialog(versionname, downloadurl, desc);
                         }
                     }
                 } catch (JSONException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
         });
     }

对话框提示下载的版本以及版本描述代码:

/**
        * 
        * @param versionname
        *            地址中版本的名字
        * @param downloadurl
        *            下载包的地址
        * @param desc
        *            版本的描述
        */
     protected void setUpDialog(String versionname, final String downloadurl,
             String desc) {
         
         AlertDialog dialog = new AlertDialog.Builder(this).setCancelable(false)
                 .setTitle("下载" + versionname + "版本").setMessage(desc)
                 .setNegativeButton("取消", null)
                 .setPositiveButton("下载", new DialogInterface.OnClickListener() {
 
                     @Override
                     public void onClick(DialogInterface arg0, int arg1) {
                         // TODO Auto-generated method stub
                        setDownLoad(downloadurl);
                     }
                 }).create();
         dialog.show();
     }

下面是正式的下载apk文件:(有些变量就自己定义一下)

/**
      * 下载包
      * 
      * @param downloadurl
      *            下载的url
      * 
      */
     @SuppressLint("SdCardPath")
     protected void setDownLoad(String downloadurl) {
         // TODO Auto-generated method stub
         RequestParams params = new RequestParams(downloadurl);
         params.setAutoRename(true);//断点下载
         params.setSaveFilePath(Environment.getExternalStorageDirectory().getPath() + File.separator+"你好.apk");
         x.http().get(params, new Callback.ProgressCallback<File>() {
 
             @Override
             public void onCancelled(CancelledException arg0) {
                 // TODO Auto-generated method stub
                 
             }
 
             @Override
             public void onError(Throwable arg0, boolean arg1) {
                 // TODO Auto-generated method stub
                 if(progressDialog!=null && progressDialog.isShowing()){
                     progressDialog.dismiss();
                 }
                 System.out.println("提示更新失败");
             }
 
             @Override
             public void onFinished() {
                 // TODO Auto-generated method stub
                 
             }
 
             @Override
             public void onSuccess(File arg0) {
                 // TODO Auto-generated method stub
                 if(progressDialog!=null && progressDialog.isShowing()){
                     progressDialog.dismiss();
                 }
                 Intent intent = new Intent(Intent.ACTION_VIEW);
                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                 intent.setDataAndType(Uri.fromFile(new File(Environment
                         .getExternalStorageDirectory(), "你好.apk")),
                         "application/vnd.android.package-archive");
                 startActivity(intent);
             }
 
             @Override
             public void onLoading(long total, long current, boolean isDownloading) {
                 // TODO Auto-generated method stub
                 progressDialog.setMax((int)total);
                 progressDialog.setProgress((int)current);
             }
 
             @Override
             public void onStarted() {
                 // TODO Auto-generated method stub
                 System.out.println("开始下载");
                 progressDialog = new ProgressDialog(LoginActivity.this);
                 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置为水平进行条
                 progressDialog.setMessage("正在下载中...");
                 progressDialog.setProgress(0);
                 progressDialog.show();
             }
 
             @Override
             public void onWaiting() {
                 // TODO Auto-generated method stub
                 
             }
         });
     }

两个辅助函数:

private void proDialogShow(Context context, String msg) {
         pDialog = new ProgressDialog(context);
         pDialog.setMessage(msg);
         // pDialog.setCancelable(false);
         pDialog.show();
     }
 
     private void PDialogHide() {
         try {
             if (pDialog != null && pDialog.isShowing()) {
                 pDialog.dismiss();
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

基本流程就在上面。(流程很清晰,不应太依赖Demo,后续有时间整理的话在放出来)


会出现的问题:

1、dewnloadurl这个下载的地址是服务器给的,如果服务器的apk文件是中文命名的,会出现安装的时候:该"解析包出现错误";

说明下载文件出现了问题。我试过几次都是这个问题,到sd卡中查看发现,明明apk文件有10多兆,下载下来只有几十k,说明文件破坏了。我告诉服务器那边把apk名称改成英文,就好了。







猜你喜欢

转载自blog.csdn.net/sunbinkang/article/details/80430502