// 下载apk,用到了xutils架包(需要导入架包置于工程的lib目录下)
// xutils的架包可以自行x度下载,文章末尾提供了个人使用的架包地址.
// xutils的注意事项:
// (1)不光lib下有该架包,还需要在Android Private Libraries下也存在[这个可能会帮你自动做]
// (2)配置清单文件里面加上网络和读取外部存储的权限[xutils一共就需要这两个权限]
//
//
// 使用:
// 获取HttpUtils对象,下载指定链接地址的APK
downLoadApk();//见"五.downLoadApk()具体实现与讲解"
一.什么是xutils?
xUtils 包含了很多实用的android工具。
xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响……
xUitls最低兼容Android 2.2 (API Level 8)。
二.xUtils的四大模块
(1)DbUtils模块
android中的orm框架,一行代码就可以进行增删改查;
支持事务,默认关闭;
可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
支持绑定外键,保存实体时外键关联实体自动保存或更新;
自动加载外键关联实体,支持延时加载;
支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。
(2)ViewUtils模块
android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
(3)HttpUtils模块
支持同步,异步方式的请求;
支持大文件上传,上传大文件不会oom;
支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。
(4)BitmapUtils模块
加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
支持加载网络图片和本地图片;
内存管理使用lru算法,更好的管理bitmap内存;
可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...
三.xUtils快速开发框架需要有以下权限
android:name="android.permission.INTERNET" android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
四.HttpUtils模块的使用方法[我们需要使用的就是这个模块]
(1)普通get方法
HttpUtils http = new HttpUtils();
http.send(HttpRequest.HttpMethod.GET,
"http://www.lidroid.com",
new RequestCallBack(){
@Override
public void onLoading(long total, long current, boolean isUploading) {
testTextView.setText(current + "/" + total);
}
@Override
public void onSuccess(ResponseInfo responseInfo) {
textView.setText(responseInfo.result);
}
@Override
public void onStart() {
}
@Override
public void onFailure(HttpException error, String msg) {
}
});
(2)上传文件或者提交数据 到服务器(post方法)
RequestParams params = new RequestParams();
params.addHeader("name", "value");
params.addQueryStringParameter("name", "value");
// 只包含字符串参数时默认使用BodyParamsEntity,
// 类似于UrlEncodedFormEntity("application/x-www-form-urlencoded")。
params.addBodyParameter("name", "value");
// 加入文件参数后默认使用MultipartEntity("multipart/form-data"),
// 如需"multipart/related",xUtils中提供的MultipartEntity支持设置subType为"related"。
// 使用params.setBodyEntity(httpEntity)可设置更多类型的HttpEntity(如:
// MultipartEntity,BodyParamsEntity,FileUploadEntity,InputStreamUploadEntity,StringEntity)。
// 例如发送json参数:params.setBodyEntity(new StringEntity(jsonStr,charset));
params.addBodyParameter("file", new File("path"));
...
HttpUtils http = new HttpUtils();
http.send(HttpRequest.HttpMethod.POST,
"uploadUrl....",
params,
new RequestCallBack() {
@Override
public void onStart() {
testTextView.setText("conn...");
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
if (isUploading) {
testTextView.setText("upload: " + current + "/" + total);
} else {
testTextView.setText("reply: " + current + "/" + total);
}
}
@Override
public void onSuccess(ResponseInfo responseInfo) {
testTextView.setText("reply: " + responseInfo.result);
}
@Override
public void onFailure(HttpException error, String msg) {
testTextView.setText(error.getExceptionCode() + ":" + msg);
}
});
(3)下载文件
HttpUtils http = new HttpUtils();
HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",
"/sdcard/httpcomponents-client-4.2.5-src.zip",
true, // 如果目标文件存在,接着未完成的部分继续下载。服务器不支持RANGE时将从新下载。
true, // 如果从请求返回信息中获取到文件名,下载完成后自动重命名。
new RequestCallBack() {
@Override
public void onStart() {
testTextView.setText("conn...");
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
testTextView.setText(current + "/" + total);
}
@Override
public void onSuccess(ResponseInfo responseInfo) {
testTextView.setText("downloaded:" + responseInfo.result.getPath());
}
@Override
public void onFailure(HttpException error, String msg) {
testTextView.setText(msg);
}
});
...
//调用cancel()方法停止下载
handler.cancel();
五.downLoadApk()具体实现与讲解
// (1)sd许要判断是否可用(挂载与否)
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// (2)apk下载到sd卡路径的获取设置
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "SafeManager.apk";
// (3)发送请求,获取apk,并且放置在指定的位置
HttpUtils httpUtils = new HttpUtils();
httpUtils.download(mdownloadUrl, path, new RequestCallBack() {
@Override
public void onStart() {
super.onStart();
ToastUtil.show(SplashActivity.this, "DownLoad Start");
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
// 参数介绍:apk的总大小,当前的下载位置,是否正在下载
super.onLoading(total, current, isUploading);
ToastUtil.show(SplashActivity.this, "DownLoading");
Log.d(tag, "" + total);
Log.d(tag, "" + current);
Log.d(tag, "" + isUploading);
}
@Override
public void onSuccess(ResponseInfo arg0) {
// 下载过后放置sd卡的apk
ToastUtil.show(SplashActivity.this, "DownLoad Success");
File file = arg0.result;
// 提示用户安装
// installApk(file);
}
@Override
public void onFailure(HttpException arg0, String arg1) {
ToastUtil.show(SplashActivity.this, "DownLoad Failure");
}
});
}
解析:
HttpHandler com.lidroid.xutils.HttpUtils.download(String url, String target, RequestCallBack callback)
url:服务器端apk的url
target:下载到本地的绝对路径
callback:RequestCallBack对象
就到这里啦!
主要讲述的是运用xutils框架实现下载文件的功能!
xutils下载地址:【稍后贴出】
よろしくお願いします。