package com.autoupdate;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.util.Log;
import android.webkit.URLUtil;
import com.autoupdate.R;
/**
* 版本检测,自动更新
*
* @author shenyj-ydrh 1.通过Url检测更新 2.下载并安装更新 3.删除临时路径
*
*/
public class MyAutoUpdate {
// 调用更新的Activity
public Activity activity = null;
// 当前版本号
public int versionCode = 0;
// 当前版本名称
public String versionName = "";
// 控制台信息标识
private static final String TAG = "AutoUpdate";
// 文件当前路径
private String currentFilePath = "";
// 安装包文件临时路径
private String currentTempFilePath = "";
// 获得文件扩展名字符串
private String fileEx = "";
// 获得文件名字符串
private String fileNa = "";
// 服务器地址
private String strURL = "http://127.0.0.1:8080/ApiDemos.apk";
private ProgressDialog dialog;
/**
* 构造方法,获得当前版本信息
*
* @param activity
*/
public MyAutoUpdate(Activity activity) {
this.activity = activity;
// 获得当前版本
getCurrentVersion();
}
/**
* 检测更新
*/
public void check() {
// 检测网络
if (isNetworkAvailable(this.activity) == false) {
return;
}
// 如果网络可用,检测到新版本
if (true) {
// 弹出对话框,选择是否需要更新版本
showUpdateDialog();
}
}
/**
* 检测是否有可用网络
*
* @param context
* @return 网络连接状态
*/
public static boolean isNetworkAvailable(Context context) {
try {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
// 获取网络信息
NetworkInfo info = cm.getActiveNetworkInfo();
// 返回检测的网络状态
return (info != null && info.isConnected());
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 弹出对话框,选择是否需要更新版本
*/
public void showUpdateDialog() {
@SuppressWarnings("unused")
AlertDialog alert = new AlertDialog.Builder(this.activity)
.setTitle("新版本").setIcon(R.drawable.ic_launcher)
.setMessage("是否更新?")
.setPositiveButton("是", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 通过地址下载文件
downloadTheFile(strURL);
// 显示更新状态,进度条
showWaitDialog();
}
})
.setNegativeButton("否", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}).show();
}
/**
* 显示更新状态,进度条
*/
public void showWaitDialog() {
dialog = new ProgressDialog(activity);
dialog.setMessage("正在更新,请稍候...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
/**
* 获得当前版本信息
*/
public void getCurrentVersion() {
try {
// 获取应用包信息
PackageInfo info = activity.getPackageManager().getPackageInfo(
activity.getPackageName(), 0);
this.versionCode = info.versionCode;
this.versionName = info.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
/**
* 截取文件名称并执行下载
*
* @param strPath
*/
private void downloadTheFile(final String strPath) {
// 获得文件文件扩展名字符串
fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length())
.toLowerCase();
// 获得文件文件名字符串
fileNa = strURL.substring(strURL.lastIndexOf("/") + 1,
strURL.lastIndexOf("."));
try {
if (strPath.equals(currentFilePath)) {
doDownloadTheFile(strPath);
}
currentFilePath = strPath;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
// 执行下载
doDownloadTheFile(strPath);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 执行新版本进行下载,并安装
*
* @param strPath
* @throws Exception
*/
private void doDownloadTheFile(String strPath) throws Exception {
Log.i(TAG, "getDataSource()");
// 判断strPath是否为网络地址
if (!URLUtil.isNetworkUrl(strPath)) {
Log.i(TAG, "服务器地址错误!");
} else {
URL myURL = new URL(strPath);
URLConnection conn = myURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
if (is == null) {
throw new RuntimeException("stream is null");
}
//生成一个临时文件
File myTempFile = File.createTempFile(fileNa, "." + fileEx);
// 安装包文件临时路径
currentTempFilePath = myTempFile.getAbsolutePath();
FileOutputStream fos = new FileOutputStream(myTempFile);
byte buf[] = new byte[128];
do {
int numread = is.read(buf);
if (numread <= 0) {
break;
}
fos.write(buf, 0, numread);
} while (true);
Log.i(TAG, "getDataSource() Download ok...");
dialog.cancel();
dialog.dismiss();
// 打开文件
openFile(myTempFile);
try {
is.close();
} catch (Exception ex) {
Log.e(TAG, "getDataSource() error: " + ex.getMessage(), ex);
}
}
}
/**
* 打开文件进行安装
*
* @param f
*/
private void openFile(File f) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
// 获得下载好的文件类型
String type = getMIMEType(f);
// 打开各种类型文件
intent.setDataAndType(Uri.fromFile(f), type);
// 安装
activity.startActivity(intent);
}
/**
* 删除临时路径里的安装包
*/
public void delFile() {
Log.i(TAG, "The TempFile(" + currentTempFilePath + ") was deleted.");
File myFile = new File(currentTempFilePath);
if (myFile.exists()) {
myFile.delete();
}
}
/**
* 获得下载文件的类型
*
* @param f
* 文件名称
* @return 文件类型
*/
private String getMIMEType(File f) {
String type = "";
// 获得文件名称
String fName = f.getName();
// 获得文件扩展名
String end = fName
.substring(fName.lastIndexOf(".") + 1, fName.length())
.toLowerCase();
if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")
|| end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {
type = "audio";
} else if (end.equals("3gp") || end.equals("mp4")) {
type = "video";
} else if (end.equals("jpg") || end.equals("gif") || end.equals("png")
|| end.equals("jpeg") || end.equals("bmp")) {
type = "image";
} else if (end.equals("apk")) {
type = "application/vnd.android.package-archive";
} else {
type = "*";
}
if (end.equals("apk")) {
} else {
type += "/*";
}
return type;
}
}
分享到:
相关推荐
这个“android版本更新 demo”项目旨在展示如何实现一个有效的版本更新系统,包括检查新版本、下载更新包以及自动升级等功能。以下是对这些关键知识点的详细解释: 1. **版本控制**:在Android应用开发中,版本控制...
android是当今移动互联网最受欢迎的一门编程语言,互联网移动产品愈来愈多,版本更新成为一个必不可少的环节,本资源提供一个jar包来读取apk的配置文件来检测版本更新。
本文将深入探讨Android版本检测安装的相关知识点,并提供实际操作的指导。 首先,了解Android版本检测的基本原理。Android系统有不同的版本,如KitKat、Lollipop、Marshmallow、Nougat、Oreo、Pie、Q、R等,每个...
在实际开发中,确保更新功能在不同网络环境、设备和Android版本上都能正常工作,发布新版本时,要遵循Google Play Store或自建应用市场的更新规范。 总之,Android应用的版本自动检测和更新涉及到多个开发环节,...
"Android版本更新简单易用"这一主题,意味着我们将探讨如何轻松地进行Android系统的升级,以及新版本带来的各种改进和功能。 Android系统更新通常包含了对旧版本问题的修复,新的用户界面设计,性能优化,以及对...
1. **版本检测服务**:在后台运行的服务会定期检查服务器上的更新信息,如新版本号、更新日志和下载链接。这通常通过HTTP请求实现,服务可能会使用`AsyncTask`或者`WorkManager`来避免阻塞主线程。 2. **版本比较...
本文将深入探讨如何在Android中实现版本检测更新的机制。 首先,我们需要理解版本更新的基本流程:检查服务器上的最新版本信息,对比本地应用的版本号,如果存在新版本,提示用户进行更新。这一过程主要涉及网络...
此外,可以提供手动检查更新的选项,让用户自行决定何时更新。 9. **更新策略**:开发者还可以选择强制更新或可选更新。强制更新通常用于修复严重安全问题,而可选更新则留给用户自行决定。 10. **测试与调试**:...
XUpdate 是一个轻量级、高可用性的Android版本更新框架,旨在简化应用版本更新的流程,提供灵活的配置和友好的用户界面。 特征 支持POST和GET两种版本检查方式,支持自定义网络请求。 支持设置只在WiFi下进行...
本文将详细探讨如何在Android系统中实现版本检测、下载以及安装的过程,确保用户能够及时获取到最新的应用版本。 首先,我们要实现版本检测。这通常涉及到服务器端与客户端的交互。服务器上会存储当前最新版本的...
- 项目源码可能包含`VersionCheck`类用于检查更新,`Downloader`类负责下载,`NotificationManager`处理用户通知,以及相关的布局文件和资源。 通过这个"版本更新Demo",开发者可以学习到如何在Android应用中实现...
在安卓(Android)开发中,版本检测和自动更新是至关重要的功能,它允许应用程序自动检测新版本并提示用户进行更新,以确保应用始终运行在最新、最安全的版本上。这个压缩包“安卓Android源码——版本检测自动更新....
在Android应用开发中,随着操作系统版本的迭代更新,开发者必须确保他们的应用程序能够在不同的Android版本上运行无误。本文将深入探讨如何实现“Android App版本更新完美适配7.0、8.0”,以及如何实现对Android 7.0...
首先,我们需要理解Android版本更新的基本流程。通常,这个过程包括检查新版本、下载更新文件(如APK)以及安装更新。以下步骤详细阐述了这一过程: 1. **检查新版本**: - 服务器端维护一个版本信息文件,包含...
8. 版本兼容性:在设计更新逻辑时,必须考虑到不同Android版本间的兼容性,确保更新过程在各个版本上都能顺畅进行。 通过以上步骤,我们可以实现Android应用的智能版本更新,并在更新过程中确保旧版本数据的正确...
"android版本更新完整版"这个标题暗示我们将讨论一个全面的Android系统更新过程,包括从下载到安装的每一个环节。 首先,"支持断点下载"是指在下载过程中,如果因为网络中断或其他原因导致下载暂停,系统能够记住...
1. **版本检测**:在Android应用中,通常会在启动时或者在后台定期检查服务器上的最新版本信息。这可以通过发送HTTP请求到服务器上的API来完成,API返回当前应用商店中的最新版本号、更新日志和下载链接。在客户端,...
本文将详细介绍两种在Android中实现版本检查更新的方式,并通过一个名为NiceyooDemo的示例项目进行阐述。这个Demo的源代码可以从提供的链接(http://blog.csdn.net/niceyoo/article/details/72674466)获取。 首先...
1. **检测更新**:应用启动时或用户触发检查更新时,应用向服务器发送请求,请求包含当前设备上的应用版本信息。 2. **获取XML**:服务器根据请求返回对应的XML更新信息。 3. **解析XML**:客户端收到XML后,解析...
在Android应用开发中,自动检测...通过以上步骤,Android应用能够实现自动检测服务器上的版本更新,下载并提示用户安装新版本,从而保持应用的最新状态。这不仅提高了用户体验,也有助于开发者及时推送修复和新特性。