Android从服务器检测更新并下载
来源:互联网 发布:税收大数据应用 编辑:程序博客网 时间:2024/06/05 01:15
package zz.itcast.mobilesafez20.activity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONException;
import org.json.JSONObject;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import zz.itcast.mobilesafez20.R;
import zz.itcast.mobilesafez20.app.MobilesafeApplication;
import zz.itcast.mobilesafez20.utils.AppUtils;
import zz.itcast.mobilesafez20.utils.MyConstant;
import zz.itcast.mobilesafez20.utils.StreamTools;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.TextView;
public class SplashActivity extends BaseActivtiy {
// 用于安装
protected static final int REQUEST_FOR_INSTALL = 1;
private int versionCode;
private String versionName;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("SplashActivity onCreate");
/*
* SplashActivity 闪屏界面 1.显示一个logo 广告 2-3秒消失 2.比如数据的初始化,或者表的创建等等
* 3.检测版本更新,去服务器检测一下是否有最新版本 如果有新版本弹对话框提示用户更新
*/
getVersionInfo();
// 这里自动更新 开发期间肯定是true 这里为了方便写成false
boolean isUpdate = sp.getBoolean(MyConstant.KEY_AUTO_UPDATE, false);
if (isUpdate) {
// 直接去检查版本更新 服务器 联网
checkUpdate();
} else {
// 不更新
new Thread() {
public void run() {
SystemClock.sleep(1500);
gotoHomePageActivity();
}
}.start();
}
}
private void checkUpdate() {
final String path = getString(R.string.update_url);
new Thread() {
public void run() {
try {
// 联网前睡一会
SystemClock.sleep(1500);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
// 联网成功
InputStream inputStream = conn.getInputStream();
// 将流转换成字符串
String jsonStr = StreamTools
.getStringFromStream(inputStream);
// 解析JSON
JSONObject jsonObj = new JSONObject(jsonStr);
// 通过键值对解析
int newCode = jsonObj.getInt("code");
String info = jsonObj.getString("info");
String apkUrl = jsonObj.getString("apkUrl");
System.out.println("新本号:" + newCode + ",新版本信息:" + info
+ ",apkurl:" + apkUrl);
// 获取到服务器版本之后 应该和本地版本做比对
if (newCode == versionCode) {
// 说明当前已经是最新版本
gotoHomePageActivity();
} else {
// 说明有新版本 弹出提示框
showUpdateDialog(info, apkUrl);
}
} else {
// 没联网成功
AppUtils.showToast("服务器忙,请稍候重试", SplashActivity.this);
gotoHomePageActivity();
}
} catch (MalformedURLException e) {
e.printStackTrace();
// 弹一个吐司 服务器忙
AppUtils.showToast("服务器忙,请稍候重试", act);
// 直接进入首页
gotoHomePageActivity();
} catch (IOException e) {
AppUtils.showToast("请检查网络设置或稍候重试", act);
// 直接进入到首页
gotoHomePageActivity();
e.printStackTrace();
} catch (JSONException e) {
AppUtils.showToast("服务器忙,请稍候重试", act);
gotoHomePageActivity();
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
gotoHomePageActivity();
AppUtils.showToast("服务器忙,请稍候重试", act);
}
}
}.start();
}
private void showUpdateDialog(String info, final String apkUrl) {
final AlertDialog.Builder builder = new Builder(this);
builder.setTitle("升级提示");
// 显示新版本的特性
builder.setMessage(info);
// 取消和确定
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
gotoHomePageActivity();
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 去下载 下载的地址
downloadApk(apkUrl);
}
});
// 强制用户无法消除对话框
// builder.setCancelable(false);
// 给对话框设置一个消失的监听
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
gotoHomePageActivity();
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
builder.show();
}
});
}
private void downloadApk(String apkUrl) {
public static final String ROOT_PATH = Environment
new RequestCallBack<File>() {
// 当开始下载
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
pd = new ProgressDialog(SplashActivity.this);
pd.setMessage("下载中...");
// 设置为水平进度样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
}
// 是HttpUtils框架自带的方法 设置最大进度和当前进度
@Override
public void onLoading(long total, long current,
boolean isUploading) {
// TODO Auto-generated method stub
super.onLoading(total, current, isUploading);
if (pd != null) {
pd.setMax((int) total);
pd.setProgress((int) current);
}
}
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
// TODO Auto-generated method stub
AppUtils.showToast("下载成功", SplashActivity.this);
if (pd != null) {
pd.dismiss();
}
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
// 通过XUtils框架返回的文件 创建一个Uri
Uri uri = Uri.fromFile(responseInfo.result);
intent.setDataAndType(uri,
"application/vnd.android.package-archive");
// 索取结果的开启
startActivityForResult(intent, REQUEST_FOR_INSTALL);
}
@Override
public void onFailure(HttpException error, String msg) {
// TODO Auto-generated method stub
AppUtils.showToast("下载失败", SplashActivity.this);
}
});
}
// 用于获取上个界面返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == REQUEST_FOR_INSTALL) {
// 说明是我们的界面的返回数据
// 如何确定点击的是哪个按钮
if (resultCode == RESULT_CANCELED) {
// 说明用户点击的是取消
System.out.println("用户点击了取消");
gotoHomePageActivity();
} else if (resultCode == RESULT_OK) {
System.out.println("用户点击了确定");
}
}
}
private void gotoHomePageActivity() {
Intent intent = new Intent(this, HomepageActivity.class);
startActivity(intent);
finish();
}
private void getVersionInfo() {
// 获取版本号和版本名称
// 包的管理类
PackageManager pm = getPackageManager();
// 0代表所有信息都获取
try {
// 通过一个方法获取本应用的包名
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
// PackageInfo 是一个javaBean 是系统封装的 代表对整个清单文件的封装
versionCode = packageInfo.versionCode;
versionName = packageInfo.versionName;
// ApplicationInfo 是对清单文件中 Application节点的封装
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONException;
import org.json.JSONObject;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import zz.itcast.mobilesafez20.R;
import zz.itcast.mobilesafez20.app.MobilesafeApplication;
import zz.itcast.mobilesafez20.utils.AppUtils;
import zz.itcast.mobilesafez20.utils.MyConstant;
import zz.itcast.mobilesafez20.utils.StreamTools;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.TextView;
public class SplashActivity extends BaseActivtiy {
// 用于安装
protected static final int REQUEST_FOR_INSTALL = 1;
private int versionCode;
private String versionName;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("SplashActivity onCreate");
/*
* SplashActivity 闪屏界面 1.显示一个logo 广告 2-3秒消失 2.比如数据的初始化,或者表的创建等等
* 3.检测版本更新,去服务器检测一下是否有最新版本 如果有新版本弹对话框提示用户更新
*/
getVersionInfo();
// 这里自动更新 开发期间肯定是true 这里为了方便写成false
boolean isUpdate = sp.getBoolean(MyConstant.KEY_AUTO_UPDATE, false);
if (isUpdate) {
// 直接去检查版本更新 服务器 联网
checkUpdate();
} else {
// 不更新
new Thread() {
public void run() {
SystemClock.sleep(1500);
gotoHomePageActivity();
}
}.start();
}
}
private void checkUpdate() {
final String path = getString(R.string.update_url);
new Thread() {
public void run() {
try {
// 联网前睡一会
SystemClock.sleep(1500);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
// 联网成功
InputStream inputStream = conn.getInputStream();
// 将流转换成字符串
String jsonStr = StreamTools
.getStringFromStream(inputStream);
// 解析JSON
JSONObject jsonObj = new JSONObject(jsonStr);
// 通过键值对解析
int newCode = jsonObj.getInt("code");
String info = jsonObj.getString("info");
String apkUrl = jsonObj.getString("apkUrl");
System.out.println("新本号:" + newCode + ",新版本信息:" + info
+ ",apkurl:" + apkUrl);
// 获取到服务器版本之后 应该和本地版本做比对
if (newCode == versionCode) {
// 说明当前已经是最新版本
gotoHomePageActivity();
} else {
// 说明有新版本 弹出提示框
showUpdateDialog(info, apkUrl);
}
} else {
// 没联网成功
AppUtils.showToast("服务器忙,请稍候重试", SplashActivity.this);
gotoHomePageActivity();
}
} catch (MalformedURLException e) {
e.printStackTrace();
// 弹一个吐司 服务器忙
AppUtils.showToast("服务器忙,请稍候重试", act);
// 直接进入首页
gotoHomePageActivity();
} catch (IOException e) {
AppUtils.showToast("请检查网络设置或稍候重试", act);
// 直接进入到首页
gotoHomePageActivity();
e.printStackTrace();
} catch (JSONException e) {
AppUtils.showToast("服务器忙,请稍候重试", act);
gotoHomePageActivity();
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
gotoHomePageActivity();
AppUtils.showToast("服务器忙,请稍候重试", act);
}
}
}.start();
}
private void showUpdateDialog(String info, final String apkUrl) {
final AlertDialog.Builder builder = new Builder(this);
builder.setTitle("升级提示");
// 显示新版本的特性
builder.setMessage(info);
// 取消和确定
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
gotoHomePageActivity();
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 去下载 下载的地址
downloadApk(apkUrl);
}
});
// 强制用户无法消除对话框
// builder.setCancelable(false);
// 给对话框设置一个消失的监听
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
gotoHomePageActivity();
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
builder.show();
}
});
}
private void downloadApk(String apkUrl) {
HttpUtils http = new HttpUtils();
private static final String root = "项目名";
public static final String ROOT_PATH = Environment
.getExternalStorageDirectory().getPath() + "/" + root;
public static final String DOWNLOAD_PATH = ROOT_PATH + "/download";
new RequestCallBack<File>() {
// 当开始下载
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
pd = new ProgressDialog(SplashActivity.this);
pd.setMessage("下载中...");
// 设置为水平进度样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
}
// 是HttpUtils框架自带的方法 设置最大进度和当前进度
@Override
public void onLoading(long total, long current,
boolean isUploading) {
// TODO Auto-generated method stub
super.onLoading(total, current, isUploading);
if (pd != null) {
pd.setMax((int) total);
pd.setProgress((int) current);
}
}
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
// TODO Auto-generated method stub
AppUtils.showToast("下载成功", SplashActivity.this);
if (pd != null) {
pd.dismiss();
}
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
// 通过XUtils框架返回的文件 创建一个Uri
Uri uri = Uri.fromFile(responseInfo.result);
intent.setDataAndType(uri,
"application/vnd.android.package-archive");
// 索取结果的开启
startActivityForResult(intent, REQUEST_FOR_INSTALL);
}
@Override
public void onFailure(HttpException error, String msg) {
// TODO Auto-generated method stub
AppUtils.showToast("下载失败", SplashActivity.this);
}
});
}
// 用于获取上个界面返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == REQUEST_FOR_INSTALL) {
// 说明是我们的界面的返回数据
// 如何确定点击的是哪个按钮
if (resultCode == RESULT_CANCELED) {
// 说明用户点击的是取消
System.out.println("用户点击了取消");
gotoHomePageActivity();
} else if (resultCode == RESULT_OK) {
System.out.println("用户点击了确定");
}
}
}
private void gotoHomePageActivity() {
Intent intent = new Intent(this, HomepageActivity.class);
startActivity(intent);
finish();
}
private void getVersionInfo() {
// 获取版本号和版本名称
// 包的管理类
PackageManager pm = getPackageManager();
// 0代表所有信息都获取
try {
// 通过一个方法获取本应用的包名
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
// PackageInfo 是一个javaBean 是系统封装的 代表对整个清单文件的封装
versionCode = packageInfo.versionCode;
versionName = packageInfo.versionName;
// ApplicationInfo 是对清单文件中 Application节点的封装
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
0 0
- Android从服务器检测更新并下载
- Android 版本检测、文件下载并更新
- Android应用检测并下载更新新版本的方法
- Android----- 版本更新和 服务器下载新版本APK并安装
- android 从服务器下载更新新版本软件 demo
- android 从服务器下载更新新版本软件 demo
- android 从服务器下载图片,并保存到本地
- Android服务器——使用TomCat实现软件的版本检测,升级,以及下载更新进度!
- Android中检测更新、通知、下载等
- Android 从服务器下载文件
- Android 从服务器下载文件
- Android 从服务器下载文件
- Android 从服务器下载apk
- Android从服务器下载文件
- Ionic3 Android 检测并下载安装app
- Android从服务器获取版本号并下载安装最新版的应用
- android AsyncTask异步下载并更新进度条
- android下载新版本并安装更新
- 计算机图形学之漫发射和镜面反射分离——基于颜色空间的双色模形法By Klinker
- Android系统中的Application和四大组件一些方法的启动顺序和一些坑
- Angularjs2报错的概览(数据为json格式)
- tester
- thunderbird中鼠标选中文字就把该文字删除了,其他软件没问题 ubuntu16.04
- Android从服务器检测更新并下载
- Scala case语句与偏函数
- swiftswift3.0自己封装的快速构建页面的方法
- js的location.hash获取锚点
- iOS上实现对HTTPS的支持
- 解决libc.so.6: version `GLIBC_2.14' not found问题
- 4、常见命令操作(详细)
- 新的开始
- Flutter进阶—通用布局控件