Android APK 版本更新的下载和安装 直接上代码
来源:互联网 发布:mac截图怎么保存 编辑:程序博客网 时间:2024/06/06 11:44
1.获取版本号
2.对比版本号
3.下载apk文件
4.启动安装
/** * 升级按钮 * * @param view */public void onUpgrade(View view) { if (isUpgrade) {//判断是否在升级中 return; } isUpgrade = true; mUpdateAPKThread = new UpdateAPKThread(this, "url"); new UpgradeThread().start();}
class UpgradeThread extends Thread { @Override public void run() { super.run(); boolean flag = mUpdateAPKThread.checkIsNeedUpdate(); Message msg = Message.obtain(); msg.what = KEY_UPGRADE; Bundle bundle = new Bundle(); bundle.putBoolean("upgrade", flag); msg.setData(bundle); handler.sendMessage(msg); }}case KEY_UPGRADE: if (msg.getData().getBoolean("upgrade")) { String message = mUpdateAPKThread.getDetail(); new AlertDialog.Builder(LoginActivity.this) .setCancelable(false) .setTitle(getString(R.string.upgrade)) .setMessage(message) .setPositiveButton(getString(R.string.confirm), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mProgressDialog = new MyProgressDialog(LoginActivity.this, getString(R.string.load), false); mUpdateAPKThread.startDownloadThread(); isUpgrade = false; } }) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { isUpgrade = false; } }).create().show(); } else { Yancy.warning(LoginActivity.this, getString(R.string.version)).show(); isUpgrade = false; } break;/** * 文件长度接口 */private int max = 0;@Overridepublic void setMax(int length) { max = length;}@Overridepublic void setProgresss(int len) { mProgressDialog.setProgress(len * 100 / max);}@Overridepublic void onSuccess() { mUpdateAPKThread.installApk(); mProgressDialog.dismiss();}@Overridepublic void onFail() { Yancy.error(this, getString(R.string.download_failed)).show(); mProgressDialog.dismiss();}package com.yancy.sdk.upgrade;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager.NameNotFoundException;import android.net.Uri;import android.os.Environment;import android.os.Handler;import android.os.Looper;import com.yancy.sdk.app.App;import com.yancy.sdk.utils.AppUtils;import org.json.JSONException;import org.json.JSONObject;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * create by dpc on 2017-5-10 */public class UpdateAPKThread { private Context mContext; private String strURL; private File downloadFile; private DownloadListener downloadListener; private String detail; private String varUrl; private String apkName; private Handler mHandler = new Handler(Looper.getMainLooper()) { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0: downloadListener.setMax((int) msg.obj); break; case 1: downloadListener.setProgresss((int) msg.obj); break; case 2: downloadListener.onSuccess(); break; case 3: downloadListener.onFail(); break; default: break; } } }; public UpdateAPKThread(Context mContext, String strURL) { this.mContext = mContext; this.strURL = strURL; setDownloadListener((DownloadListener) mContext); } public void setDownloadListener(DownloadListener downloadListener) { this.downloadListener = downloadListener; } public interface DownloadListener { /** * 设置文件长度 * * @param length */ void setMax(int length); /** * 进度 * * @param len */ void setProgresss(int len); /** * 成功 */ void onSuccess(); /** * 失败 */ void onFail(); } /** * 是否需要更新 * * @return */ public boolean checkIsNeedUpdate() { if (strURL.equals("")) { return false; } String data = getJsonContent(strURL); if (data.equals("")) { return false; } return parseJson(mContext, data); } private boolean parseJson(Context context, String strResult) { try { JSONObject jsonObject = new JSONObject(strResult); String verName = jsonObject.getString("verName"); String verCode = jsonObject.getString("verCode"); varUrl = jsonObject.getString("varUrl"); detail = jsonObject.getString("detail"); apkName = jsonObject.getString("apkname"); int code = Integer.parseInt(verCode); if (code > AppUtils.getVersionCode(context)) { return true; } } catch (JSONException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStackTrace(); } return false; } private String getJsonContent(String urlStr) { try { URL url = new URL(urlStr); HttpURLConnection httpConn = (HttpURLConnection) url .openConnection(); // 设置连接属性 httpConn.setConnectTimeout(3000); httpConn.setDoInput(true); httpConn.setRequestMethod("GET"); httpConn.connect(); if (200 == httpConn.getResponseCode()) { return ConvertStream2Json(httpConn.getInputStream()); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; } private String ConvertStream2Json(InputStream inputStream) { String jsonStr = ""; ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; try { while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, len); } jsonStr = new String(out.toByteArray()); } catch (IOException e) { e.printStackTrace(); } return jsonStr; } public String getDetail() { return detail; } Thread mThread; boolean isDownloading = false; public void startDownloadThread() { final String urlStr = varUrl; final String fileName = apkName; mThread = new Thread() { public void run() { isDownloading = true; try { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); // 获得文件的长度 int contentLength = conn.getContentLength(); mHandler.obtainMessage(0, contentLength).sendToTarget(); File filePath = new File(Environment.getExternalStorageDirectory() + "/apk/"); if (!filePath.exists()) { filePath.mkdirs(); filePath = new File(Environment.getExternalStorageDirectory() + "/apk/" + "/.test.txt"); if (!filePath.exists()) try { filePath.createNewFile(); } catch (IOException e) { e.printStackTrace(); } FileNotification.updateNotify(filePath); } String pathName = Environment.getExternalStorageDirectory() + "/apk/" + fileName; downloadFile = new File(pathName); InputStream input = conn.getInputStream(); if (downloadFile.exists()) { downloadFile.delete(); } downloadFile.createNewFile(); FileOutputStream output = new FileOutputStream(downloadFile); byte[] buffer = new byte[1024]; int len; // 重要参数 int sum = 0; while ((len = input.read(buffer)) != -1 && isDownloading) { sum += len; mHandler.obtainMessage(1, sum).sendToTarget(); output.write(buffer, 0, len); Thread.sleep(1); } output.close(); input.close(); mHandler.obtainMessage(2).sendToTarget(); } catch (IOException e1) { mHandler.obtainMessage(3).sendToTarget(); e1.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }; mThread.start(); } /** * 安装APK文件 */ public void installApk() { if (downloadFile != null && !downloadFile.exists()) { return; } Intent i = new Intent(Intent.ACTION_VIEW); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setDataAndType(Uri.parse("file://" + downloadFile.toString()), "application/vnd.android.package-archive"); mContext.startActivity(i); }}
阅读全文
2 0
- Android APK 版本更新的下载和安装 直接上代码
- Android----- 版本更新和 服务器下载新版本APK并安装
- apk版本更新下载安装
- Android APK版本更新下载
- android 7.0 apk版本更新,下载之后自动安装
- Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
- Android 版本更新下载自动安装APK,并解决Android6.0,7.0安装失败的问题
- apk的更新和下载安装
- Android代码实现APK的下载安装和卸载<1>
- Android代码实现APK的下载安装和卸载<2>
- android 实现版本更新和下载安装
- Android-async-http下载APK版本更新
- APK的下载更新安装
- 从服务器上下载更新,下载完成之后替换更新程序的代码(下载前后apk的签名必须一样,否则出现安装错误)
- Android 版本升级(APK下载和安装)
- android 获得安装apk包的版本信息 和 版本升级 代码
- android apk的更新下载
- Android 更新下载apk 安装apk 打开apk
- 微信小票打印机接口怎么写 微信餐饮外卖订餐系统对接流程
- 【FZU
- C Clion开发工具注册码
- Hbase详解(下)
- 基于Spring Boot和Spring Cloud实现微服务架构学习(五)-Docker总结
- Android APK 版本更新的下载和安装 直接上代码
- Quartz学习6:Quartz在Spring中如何动态配置时间
- 无向带权图的最小生成树算法——Prim及Kruskal算法思路
- leetcode 第一题:使用哈希表解决
- 141.linked list cycle
- Time To Get Up
- 使用VS2015的Visual Studio Installer打包
- Spring 集成JediisCluster【redis使用】
- Hibernate初探之单表映射