首先获取本地apk版本:
/**
* 获取本地软件版本
*/
public static int getLocalVersion(Context ctx){
int localVersion = 0;
try {
PackageInfo packageInfo = ctx.getApplicationContext()
.getPackageManager().getPackageInfo(ctx.getPackageName(), 0);
localVersion = packageInfo.versionCode;
Log.d("TAG", "本软件的版本。。"+localVersion);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return localVersion;
}
然后获取服务器版本,这个可以通过很多方式获取就自己发挥
获取服务器版本后跟本地apk版本进行比较:
如果低于服务器版本就进行更新:(本人写的仅供参考,我是异步下载的,然后通知的方式显示进度)
/** * 用于更新app版本 * * @param ctx * 上下文对象 * @param url * 更新版本的地址 */ private static PendingIntent pendingIntent; public static void UpdateVersion(final Context ctx, String url) { createNotification(ctx); // 创建文件,读取app_name createFile(ctx.getResources().getString(R.string.app_name)); new AsyncTask<String, Void, String>() { @Override protected String doInBackground(String... params) { int down_step = 1;// 提示step int totalSize;// 文件总大小 int downloadCount = 0;// 已经下载好的大小 int updateCount = 0;// 已经上传的文件大小 InputStream inputStream; OutputStream outputStream; URL url; HttpURLConnection httpURLConnection = null; try { url = new URL(params[0]); httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setConnectTimeout(TIMEOUT); httpURLConnection.setReadTimeout(TIMEOUT); // 获取下载文件的size totalSize = httpURLConnection.getContentLength(); // Log.d("TAG", "totalSize"+totalSize); if (httpURLConnection.getResponseCode() == 404) { throw new Exception("fail!"); } inputStream = httpURLConnection.getInputStream(); // File appFile=File.createTempFile("中拓钢铁",".apk"); outputStream = new FileOutputStream(updateFile, false);// 文件存在则覆盖掉 byte buffer[] = new byte[1024]; int readsize = 0; while ((readsize = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, readsize); downloadCount += readsize;// 时时获取下载到的大小 // Log.d("TAG", "downloadCount"+downloadCount); /** * 每次增张1% */ if (updateCount == 0 || (downloadCount * 100 / totalSize - down_step) >= updateCount) { updateCount += down_step; // 改变通知栏 // Log.d("TAG", "开始下载。。"); builder = new Notification.Builder(ctx) .setSmallIcon(R.drawable.logo) .setContentText( "正在下载(" + updateCount + "%)...") .setProgress(100, updateCount, false); manager.notify(8, builder.build()); } } if (httpURLConnection != null) { httpURLConnection.disconnect(); } inputStream.close(); outputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { // 下载完成,点击安装 System.out.println("updateFile.." + updateFile); Uri uri = Uri.fromFile(updateFile); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "application/vnd.android.package-archive"); pendingIntent = PendingIntent.getActivity(ctx, 0, intent, 0); builder = new Notification.Builder(ctx) .setSmallIcon(R.drawable.logo) .setContentIntent(pendingIntent) .setContentTitle("apk下载更新") .setContentText("下载成功,请点击安装") .setProgress(100, 100, false); manager.notify(8, builder.build()); } }.execute(url); } private static void createNotification(Context ctx) { // 最普通的通知栏 manager = (NotificationManager) ctx .getSystemService(ctx.NOTIFICATION_SERVICE); builder = new Notification.Builder(ctx).setSmallIcon(R.drawable.logo) .setContentTitle("apk下载更新").setContentText("准备下载...") .setProgress(100, 0, false); manager.notify(8, builder.build()); }
当下载完成后,可以点击安装。
注:当你的apk是签名后的,如果手机上面的apk是没有签名的,那么在安装时会提示签名不同的包冲突,无法安装,这样只能卸载没有签名的apk后再安装