Android使用xutils3框架实现应用程序内的检查更新下载服务器存放的新版APK文件
16lz
2022-05-10
纵观现在的好多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() { @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() { @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名称改成英文,就好了。
更多相关文章
- 还在用android.support?该考虑迁移AndroidX了!
- Android(安卓)Studio SDK版本兼容问题,拷贝的Android包文件报错
- android Widget添加过程和android添加widget不更新的问题分析解
- 使用Maven管理Android项目(一)
- Android(安卓)SDK 2.2 开发环境详解
- Android(安卓)SDK,ADT,以及API的理解
- AndroidX介绍及项目迁移
- 离线配置Android开发环境
- 教你如何在 Android(安卓)使用多线程下载文件