- 浏览: 13162 次
文章分类
最新评论
版本校验和更新
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;
}
}
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;
}
}
相关推荐
《VS2017-VC++版本校验和计算小工具详解》 在软件开发过程中,校验和计算是一项至关重要的任务,它主要用于检测数据在传输或存储过程中的完整性。对于VS2017(Visual Studio 2017)用户,特别是那些使用VC++...
这个文件名表明了这是一个版本为1.1的校验和计算软件。"V1.1"意味着它是该软件的第一个主要版本后的第一个小更新,可能包含了bug修复、性能优化或者新功能的添加。 **相关知识点** 1. **数据完整性** - 校验和的...
2. **版本校验**:版本校验是版本控制系统的一部分,主要涉及到验证软件系统的版本号是否符合规定格式,以及在更新时是否正确。例如,版本号通常由主版本号、次版本号和修改号组成,每个部分都有特定含义。主版本号...
为了保护这些文件不被意外更改,可以定期计算它们的校验和,并在版本控制系统中记录,以便于对比和恢复。 至于01.txt这样的文本文件,备份(Backup)和 wg011 文件夹,它们可能包含了项目的数据或源代码。定期计算...
3. 系统完整性检查:操作系统或软件更新后,可以计算新版本的校验和,与官方提供的值进行比对,以确认更新成功且无恶意篡改。 4. 数据一致性:在分布式系统中,通过校验和可以确保各个节点的数据一致性,避免因网络...
此外,它可能还具备一些高级功能,如比较不同版本的文件校验和、验证数字签名,甚至可能支持批处理模式,一次性处理多个文件的校验和计算。 校验和本身是一种简单的哈希计算,通过特定算法(如CRC、MD5或SHA家族)...
3. 自动更新:某些CheckSum工具支持自动更新文件的校验和,当文件发生变动时,记录会自动更新,提高了工作效率。 4. 多格式支持:CheckSum工具往往兼容多种校验和算法,如MD5、SHA-1、SHA-256等,满足不同场景的需求...
这可能包括更新sendip的源代码,以便在生成校验和时考虑更多的上下文信息。 修正后的sendip版本(如压缩包中的sendip-2.5-修正checksum-bug)对于网络管理员、安全研究人员和开发者来说是极其宝贵的,因为它增强了...
"飘荡软件.url"则可能是一个快捷方式或者链接,指向该软件的官方网站或者下载页面,用户可以通过这个链接获取更多关于软件的信息或者获取更新版本。 总的来说,CS校验和计算是保证数据完整性和正确性的重要手段,而...
对于开发者而言,这样的工具可以帮助他们在代码版本控制中检查更新的正确性,对于普通用户,则可以防止恶意篡改或者因传输错误导致的数据损失。 总之,计算校验和的工具软件是IT工作中一个实用且重要的辅助工具,它...
支持MD5文件校验、版本忽略、版本强制更新等功能。 支持自定义请求API接口。 兼容Android6.0、7.0和8.0。 支持中文和英文两种语言显示(国际化)。 组成结构 版本更新检查器IUpdateChecker检查是否有最新...
这包括验证下载文件的完整性(如通过校验和)以及只信任来自预期源的更新。 9. **配置管理**:应用程序可能需要保存用户的个性化设置或数据,更新时应确保这些不受影响。更新过程可能需要备份用户数据,或者设计一...
同时,文件的完整性可以通过校验和(如MD5或SHA)进行验证。 6. **安装更新**:下载完成后,安装过程开始。在iOS系统中,可能需要使用iTunes或App Store进行更新;在Android系统中,可以自定义安装逻辑,但需遵循...
具体到压缩包内的文件,"电总协议校验和工具(免费电总协议校验助手)V1.1 绿色免费版"很可能是一个免安装、可以直接使用的软件版本。绿色版软件通常不需要复杂的安装步骤,只需解压后即可运行,方便用户在不同设备上...
综上所述,实现MFC程序的自动升级更新需要结合网络编程、文件校验和项目管理等多方面技术。开发者需要考虑如何设计高效且可靠的更新机制,确保用户体验的同时保证数据安全。通过MD5校验,可以确保文件在传输过程中的...
"Hash校验工具.exe"这个文件很可能是该工具的可执行程序,用户可以直接运行来进行文件的哈希校验和版本记录操作。在实际使用中,用户可以将每个文件的哈希值和版本信息保存到数据库或文本文件中,便于后续查询和分析...
1. **请求版本信息**:客户端软件通过网络连接到服务器,发送请求以获取最新的版本信息,如版本号、发布日期和更新日志等。 2. **比较版本**:服务器返回新版本的信息后,客户端会将其与本地安装的版本进行比较。...
一个很好的TI msp430/cc430单片机CRC16校验码计算器,输入待校验数据,直接计算出校验码,目前网上几乎没有TI的校验码工具 使用说明: ...3、5/6xx版本BSL校验不包含起始帧(80)和长度(80后两字节)
在Unity游戏开发中,版本控制和更新机制是至关重要的部分,确保玩家总是使用最新、最稳定的游戏版本。本文将深入探讨“Unity Md5更新版本值设置”这一主题,以及如何利用工具自动生成文件夹下的所有Md5值进行版本...
这可能包括验证更新包的完整性(如使用SHA校验和),静默安装,或提示用户确认安装。在Windows系统中,可能需要管理员权限;在移动设备上,需遵循各自平台的权限和更新机制。 7. 用户体验考虑:自动更新应当尊重...