Android 自动更新APK
2013-05-06 18:14
330 查看
<pre name="code" class="java">第一次写博客,可能很多地方没表述清楚,请大家一定提出,我会多加改正,让博客的质量越来越好,下面直奔主题: 基本上每个应用都有这个功能:版本更新,当然我们公司的应用也不例外,由于我也是才接触Android,所以借鉴了许多前辈的方法,结合自己的了解和网上查阅的资料,总结了版本更新的主要逻辑如下: 1:获取当前应用的版本号、版本名称等 2:用当前版本号和原来的进行对比 3:如果版本相同,这提示是最新版本,不相同则去下载新的apk 4:用新的apk替换掉原来的apk, 下面分别介绍,粗糙代码,多多包涵 1:获取版本等: /** * 获取当前版本号 */ public int getVersionCode() throws Exception { // 获取PackageManager的实例 PackageManager packageManager = getPackageManager(); // getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); return packInfo.versionCode; } /** * 获取当前版本名称 */ public String getVersionName() throws Exception { // 获取PackageManager的实例 PackageManager packageManager = getPackageManager(); // getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); return packInfo.versionName; } 2:对比版本号 /** * 从服务器获取XML文件解析并进行对比版本号 */ public void checkUpdate() { try { // XML文件的路径 String path = getResources().getString(R.string.serverurl); // 包装成URL对象 URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 获取写入流对象 InputStream is = conn.getInputStream(); info = UpdataInfoManager.getUpdataInfo(is); // 获取版本号 versionname = getVersionName(); // 版本号相同,无需升级 if (info.getVersion().equals(versionname)) { pro_Dialog.dismiss(); thread = new Thread(runnable); thread.start(); } // 版本号不同,提示用户升级 else { Message msg = new Message(); msg.what = UPDATA_CLIENT; handler.sendMessage(msg); } } catch (Exception e) { // 待处理 Message msg = new Message(); msg.what = GET_UNDATAINFO_ERROR; handler.sendMessage(msg); e.printStackTrace(); } } 3:下载新的apk /** * 下载更新的方法 */ protected void downLoadApk() { // 得到更新地址 final String path = info.getUrl(); // 创建更新对话框 pd = new ProgressDialog(this); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("正在下载更新"); pd.show(); // 创建线程开始更新 new Thread() { @Override public void run() { try { file = getFileFromServer(path, pd); } catch (Exception e) { // 创建消息对象 Message msg = new Message(); msg.what = DOWN_ERROR; // 将消息发送出去 handler.sendMessage(msg); e.printStackTrace(); } } }.start(); } /** * 下载更新 * @param path * @param pd * @return file * @throws Exception */ public File getFileFromServer(String path, ProgressDialog pd) throws Exception { URL url = new URL(path); conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); pd.setMax(100); is = conn.getInputStream(); // 定义File用来存放apk File file = new File(Environment.getExternalStorageDirectory(), "main.apk"); // 判断文件是否存在,不存在则重新创建 if (!file.exists()) { file.createNewFile(); } // 否则就删除 else { file.delete(); } // 获取读写流对象 fos = new FileOutputStream(file); bis = new BufferedInputStream(is); byte[] buffer = new byte[1024]; // 定义变量表示下载的进度 int len = 0; int cur = 0; // 获取文件大小 int total = conn.getContentLength(); while ((len = bis.read(buffer)) != -1) { fos.write(buffer, 0, len); cur += len; // 获取当前下载量 progress = (int) (((float) cur / total) * 100); handler.sendEmptyMessage(DOWNLOAD_ING); } if (len == -1) { handler.sendEmptyMessage(DOWNLOAD_OVER); } // 关闭读写流 fos.close(); bis.close(); is.close(); return file; } // 声明Handler接口用来判断更新状态 Handler handler = new Handler() { @SuppressLint("HandlerLeak") @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case UPDATA_CLIENT: pro_Dialog.dismiss(); // 对话框提示用户升级 showUpdataDialog(); break; case DOWNLOAD_ING: // 显示下载进度条 pd.setProgress(progress); break; case GET_UNDATAINFO_ERROR: pro_Dialog.dismiss(); // 服务器超时 Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1) .show(); thread = new Thread(runnable); thread.start(); break; case DOWN_ERROR: // 下载apk失败 Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show(); break; case DOWNLOAD_OVER: // 下载apk成功 Toast.makeText(VersionActivity.this, "下载完成", 1).show(); pd.dismiss(); // 安装apk installApk(file); break; } } }; 4:最后就是替换成最新apk了 /** * 安装apk的方法 * @param file */ protected void installApk(File file) { Intent intent = new Intent(); // 执行动作 intent.setAction(Intent.ACTION_VIEW); // 得到apk的路径 String openPath = Environment.getExternalStorageDirectory() + "/" + "main.apk"; // 执行的数据类型 intent.setDataAndType(Uri.parse("file://" + openPath), "application/vnd.android.package-archive"); this.startActivity(intent); } 以上就是我学到的更新版本的东西了,我也是站在巨人的肩膀上看世界,感谢那些无私奉献的程序员们。 希望我的技术越来越好,博客也越写越好。
</pre><pre class="java" name="code">
相关文章推荐
- 利用fir.im提供的api接口实现android apk自动更新和手动更新
- android 自动更新apk版本
- Android Apk自动更新service(直接拿来用)转载
- android之apk自动更新解析包失败问题
- Android 自动检测更新apk版本
- android之apk自动更新采用Notification通知提示并显示下载进度
- Android客户端apk自动检测更新自动下载自动安装的实现方法
- android 自动更新apk版本
- Android 代码自动升级新版本更新apk时出现“已安装了存在签名冲突的同名数据包”
- android之apk自动更新解析包失败问题
- android 自动更新apk版本
- Android Apk自动更新service(直接拿来用)
- Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
- 有关android apk的版本号能否自动更新?
- Android 版本更新下载自动安装APK,并解决Android6.0,7.0安装失败的问题
- Android 自动更新Apk组件封装
- Android Apk自动更新service(直接拿来用)
- android 自动更新apk版本
- Android Apk自动更新service(直接拿来用)
- android 7.0 apk版本更新,下载之后自动安装