Android应用程序更新并下载
创建一个新类,名为UpdateManager,代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import com.af.mobile.R;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast; public class UpdateManager
{private URL url=null;
/* 下载中 */
private static final int DOWNLOAD = 1;
/* 下载结束 */
private static final int DOWNLOAD_FINISH = 2;
/* 保存解析的XML信息 */
//HashMap<String, String> mHashMap;
/* 下载保存路径 */
private String mSavePath;
/* 记录进度条数量 */
private int progress;
/* 是否取消更新 */
private boolean cancelUpdate = false; private Context mContext;
/* 更新进度条 */
private ProgressBar mProgress;
private Dialog mDownloadDialog; private Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what)
{
// 正在下载
case DOWNLOAD:
// 设置进度条位置
mProgress.setProgress(progress);
break;
case DOWNLOAD_FINISH:
// 安装文件
installApk();
break;
default:
break;
}
};
}; public UpdateManager(Context context)
{
this.mContext = context;
} public void checkUpdate()
{
if (isUpdate())
{
showNoticeDialog();
} else
{ }
} /**
* 检查软件是否有更新版本
*
* @return
*/
private boolean isUpdate()
{
// 获取当前软件版本
Double versionCode = getVersionCode(mContext); Double serviceCode = 1.2;
// 版本判断
if (serviceCode > versionCode)
{
return true;
} return false;
} // 获取软件版本号 private Double getVersionCode(Context context)
{
Double versionCode = 0.0;
try
{
// 获取软件版本号,对应AndroidManifest.xml下android:versionCode
versionCode = (double) context.getPackageManager().getPackageInfo("com.af.mobile", 0).versionCode;
} catch (NameNotFoundException e)
{
e.printStackTrace();
}
return versionCode;
} //显示软件更新对话框 private void showNoticeDialog()
{
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle("软件更新");
String string=download("http://192.168.0.102:9313/daojuserver/uploads/version.xml");//xml的下载地址
builder.setMessage(string); builder.setPositiveButton("更新", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 显示下载对话框
showDownloadDialog();
}
});
// 稍后更新
builder.setNegativeButton("稍后更新", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
} // 显示软件下载对话框 private void showDownloadDialog()
{
// 构造软件下载对话框
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle("djfkjd");//提示信息内容
// 给下载对话框增加进度条
final LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.softupdate_progress, null);
mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
builder.setView(v);
// 取消更新
builder.setNegativeButton("取消更新", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 设置取消状态
cancelUpdate = true;
}
});
mDownloadDialog = builder.create();
mDownloadDialog.show();
// 现在文件
downloadApk();
} private void downloadApk()
{
// 启动新线程下载软件
new downloadApkThread().start();
} private class downloadApkThread extends Thread
{
@Override
public void run()
{
try
{
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
// 获得存储卡的路径
String sdpath = Environment.getExternalStorageDirectory() + "/";
mSavePath = sdpath + "download";
URL url = new URL("http://192.168.0.102:9313/daojuserver/uploads/SpMobile.apk");//apk下载地址地址
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
// 获取文件大小
int length = conn.getContentLength();
// 创建输入流
InputStream is = conn.getInputStream(); File file = new File(mSavePath);
if (!file.exists())
{
file.mkdir();
}
File apkFile = new File(mSavePath, "dhfudh");
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);
if (numread <= 0)
{
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
break;
}
fos.write(buf, 0, numread);
} while (!cancelUpdate);
fos.close();
is.close();
}
} catch (MalformedURLException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
// 取消下载对话框显示
mDownloadDialog.dismiss();
}
}; private void installApk()
{
File apkfile = new File(mSavePath, "dhfudh");
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);
}
public String download(String urlString)
{
StringBuffer sbBuffer=new StringBuffer();
String line=null;
BufferedReader buffer=null;
try {
url=new URL(urlString);
HttpURLConnection urlConn=(HttpURLConnection) url.openConnection();
buffer=new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
while((line=buffer.readLine())!=null)
{
sbBuffer.append(line);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
finally
{
try {
buffer.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
return sbBuffer.toString();
}
}
UpdateManager
在Android应用程序Main界面
if(isOpenNetwork())//判断是否有网络
{
UpdateManager manager = new UpdateManager(Main.this);
// 检查软件更新
manager.checkUpdate(); }
判断
判断移动端是否有网络
private boolean isOpenNetwork() {
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connManager.getActiveNetworkInfo();
if (networkInfo != null) {
// 2.获取当前网络连接的类型信息
int networkType = networkInfo.getType();
if (ConnectivityManager.TYPE_WIFI == networkType) {
// 当前为wifi网络
} else if (ConnectivityManager.TYPE_MOBILE == networkType) {
// 当前为mobile网络
}
return connManager.getActiveNetworkInfo().isAvailable();
}
return false;
}
Android应用程序更新并下载的更多相关文章
- 体验极速Android SDK的更新与下载
首先:国内明确一点,国内由于天朝限制了google,更新和下载Android相关资料都比较吃力,因此,本文正式宣告,此问题不再是问题-------别说话,吻我 先给点福利: 关于java(Androi ...
- 解决Android SDK Manager 更新、下载慢以及待安装包列表不显示
参考地址:http://www.cnblogs.com/tc310/archive/2012/12/21/2828450.html 问题描述: Android SDK Manager 无法下载更新,或 ...
- Android开发之应用程序更新实现
近期给项目app做升级.对Android应用程序更新稍有研究,分享一下我的心得. 既然是更新,那么一定是要联网和下载的.所以联网和存储訪问权限时一定要有的: <!-- 权限申请 --> ...
- Android应用程序的自动更新升级(自身升级、通过tomcat)(转)
Android应用程序的自动更新升级(自身升级.通过tomcat) http://blog.csdn.net/mu0206mu/article/details/7204746 刚入手android一个 ...
- 同步、更新、下载Android Source & SDK from 国内镜像站(转载)
同步.更新.下载Android Source & SDK from 国内镜像站 转自: 同步.更新.下载Android Source & SDK from 国内镜像站 Download ...
- 同步、更新、下载Android Source & SDK from 国内镜像站
转自: 同步.更新.下载Android Source & SDK from 国内镜像站 Download the android source from china mirrors 以 ...
- Android小项目之十 应用程序更新的签名问题
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Android Studio最新稳定版下载 - 百度网盘(更新于2017年7月14日)
Android Studio是一个为Android平台开发程序的集成开发环境,其包含用于构建Android应用所需的所有工具.Android Studio 2.3.3为最新稳定版(截止到2017年7月 ...
- 使用 Eclipse PhoneGap 构建 Android 应用程序入门
Eclipse 是一种支持多种技术的开源集成开发环境 (IDE),但本文重点介绍 Java 支持,这也是 Android 应用程序的“母语”.Android 是 Google 发布的开源移动操作系统. ...
随机推荐
- Java中显示图片的方法
最近在做一个swing小项目,其中需要把存储在硬盘中的图片文件显示出来,总结了如下方法: 1. Graphics g = getGraphics();String name = "E:/Ca ...
- 解析java泛型(二)
上篇我们简单的介绍了java中泛型的最基本的内容,知道了什么是泛型以及泛型对我们的程序编写有什么好处,最后一类型限定收尾.本篇将从类型限定开始阐述java泛型中很重要的概念:通配符 一.何为通配符 ...
- SQL中的存储过程和函数
存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如 ...
- 2017 CVTE春招内推专场 C/C++软件开发岗笔试编程题
先来一波吐槽:选择题全是不定项选择,考的内容在我看来,"反正我接受唔到咯". 比如: 1.Windows操作系统某个通信机制(具体题目忘了,反正答案我选了个熟悉的名词"消 ...
- Oracle 11g 删除归档日志
工作环境ORACLE 11g 归档日志满了,手动删除出现 ora 异常. 注:工作环境是linux redhat 5 执行命令如下: 1. 进入rman 2. connect target / 3. ...
- 获取元素最终的background-color
通常我们都会先获取元素,然后得到style对象获取对应的css属性值: 下面,假设我定义一个div并在css中给定了指定的background-color: 这里并没有考虑!important/内联的 ...
- Docker笔记二:Lumen & Redis
Lumen 基于 Laravel 打造,专为构建微服务和 APIs 而生:Redis 与 Memcached 均为常用的 key-value 内存对象缓存服务(系统),免费开源,Redis 支持持久化 ...
- 如何用好消息推送(JPush)为app拉新、留存、促活
如何用好消息推送(JPush)为app拉新.留存.促活 作为移动端APP产品运营最重要的运营手段,消息推送(JPush)被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越 ...
- Swashbuckle Swagger组件扩展
用Swagger有一段时间, 我的model层是一个单独的dll 但给Swagger配置的是api层dll的XML. 所以就导致了model字段的注释不能够反应到参数说明. 所以我fork了一份 ...
- Nginx+IIS+Redis 处理Session共享问题 2
接下来主要说下利用nginx来测试 两台Windows server 1.10.120.131.210 - 端口84部署demo 2.10.120.131.211 - 端口84部署demo ngi ...