很多时候需要做自动更新,就需要实现先联网比对版本号,如果服务器上软件的版本号比本地的高,那么就提示用户更新软件,下载和安装的实例如下:
private class downloadApkThread extends Thread
{ //新起一个线程,进行耗时操作。
@Override
public void run()
{ <span style="white-space:pre"> </span>//重写run()方法
try
{
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
// 获得存储卡的路径
String sdpath = Environment.getExternalStorageDirectory() + "/";
mSavePath = sdpath + "download"; //设定一个download文件夹的路径
URL url = new URL(mHashMap.get("url")); //此处的url可以以参数的形式传递到此方法中来
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
// 获取文件大小
int length = conn.getContentLength();
// 创建输入流
InputStream is = conn.getInputStream();
<span style="white-space:pre"> </span>//获取connection的输入流
File file = new File(mSavePath);
// 判断文件目录是否存在
if (!file.exists())
{
file.mkdir(); //如果不存在,则创建路径
}
File apkFile = new File(mSavePath, mHashMap.get("name")); //定义apk文件名和存储路径
FileOutputStream fos = new FileOutputStream(apkFile); //创建一个输出流。用于书写下载的文件
int count = 0;
// 定义缓存区
byte buf[] = new byte[1024];
// 写入到文件中
do
{
int numread = is.read(buf);
count += numread;
// 计算进度条位置
progress = (int) (((float) count / length) * 100);
// 更新进度
mHandler.sendEmptyMessage(DOWNLOAD); //向主线程发送handler消息,表示正在下载
if (numread <= 0)
{
<span style="font-family: Arial, Helvetica, sans-serif;">//向主线程发送handler消息,</span><span style="font-family: Arial, Helvetica, sans-serif;">下载完成</span>
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
break;
}
// 写入文件
fos.write(buf, 0, numread); //输出流,写入文件
} while (!cancelUpdate);// 点击取消就停止下载.
fos.close(); //关闭输出流
is.close();<span style="white-space:pre"> </span>//关闭输入流
}
} catch (MalformedURLException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
// 取消下载对话框显示
mDownloadDialog.dismiss();
}
};
/**
* 安装APK文件
*/
private void installApk()
{
File apkfile = new File(mSavePath, mHashMap.get("name"));
if (!apkfile.exists())
{
return; //如果文件不存在,则返回
}
// 通过Intent安装APK文件
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
mContext.startActivity(i);
}
}