1.获取版本号
2.对比版本号
3.下载apk文件
4.启动安装
/**
* 升级
*
* @param view
*/
public void onUpgrade(View view) {
if (isUpgrade) {
return;
}
isUpgrade = true;
mUpdateAPKThread = new UpdateAPKThread(this, "url");
new UpgradeThread().start();
}
class UpgradeThread extends Thread {
@Override
public void run() {
super.run();
boolean flag = mUpdateAPKThread.checkIsNeedUpdate();
Message msg = Message.obtain();
msg.what = KEY_UPGRADE;
Bundle bundle = new Bundle();
bundle.putBoolean("upgrade", flag);
msg.setData(bundle);
handler.sendMessage(msg);
}
}
case KEY_UPGRADE:
if (msg.getData().getBoolean("upgrade")) {
String message = mUpdateAPKThread.getDetail();
new AlertDialog.Builder(LoginActivity.this)
.setCancelable(false)
.setTitle(getString(R.string.upgrade))
.setMessage(message)
.setPositiveButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mProgressDialog = new MyProgressDialog(LoginActivity.this, getString(R.string.load), false);
mUpdateAPKThread.startDownloadThread();
isUpgrade = false;
}
})
.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isUpgrade = false;
}
}).create().show();
} else {
Yancy.warning(LoginActivity.this, getString(R.string.version)).show();
isUpgrade = false;
}
break;
/**
* 文件长度
*/
private int max = 0;
@Override
public void setMax(int length) {
max = length;
}
@Override
public void setProgresss(int len) {
mProgressDialog.setProgress(len * 100 / max);
}
@Override
public void onSuccess() {
mUpdateAPKThread.installApk();
mProgressDialog.dismiss();
}
@Override
public void onFail() {
Yancy.error(this, getString(R.string.download_failed)).show();
mProgressDialog.dismiss();
}
package com.yancy.sdk.upgrade;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import com.yancy.sdk.app.App;
import com.yancy.sdk.utils.AppUtils;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
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;
/**
* create by dpc on 2017-5-10
*/
public class UpdateAPKThread {
private Context mContext;
private String strURL;
private File downloadFile;
private DownloadListener downloadListener;
private String detail;
private String varUrl;
private String apkName;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
downloadListener.setMax((int) msg.obj);
break;
case 1:
downloadListener.setProgresss((int) msg.obj);
break;
case 2:
downloadListener.onSuccess();
break;
case 3:
downloadListener.onFail();
break;
default:
break;
}
}
};
public UpdateAPKThread(Context mContext, String strURL) {
this.mContext = mContext;
this.strURL = strURL;
setDownloadListener((DownloadListener) mContext);
}
public void setDownloadListener(DownloadListener downloadListener) {
this.downloadListener = downloadListener;
}
public interface DownloadListener {
/**
* 设置文件长度
*
* @param length
*/
void setMax(int length);
/**
* 进度
*
* @param len
*/
void setProgresss(int len);
/**
* 成功
*/
void onSuccess();
/**
* 失败
*/
void onFail();
}
/**
* 是否需要更新
*
* @return
*/
public boolean checkIsNeedUpdate() {
if (strURL.equals("")) {
return false;
}
String data = getJsonContent(strURL);
if (data.equals("")) {
return false;
}
return parseJson(mContext, data);
}
private boolean parseJson(Context context, String strResult) {
try {
JSONObject jsonObject = new JSONObject(strResult);
String verName = jsonObject.getString("verName");
String verCode = jsonObject.getString("verCode");
varUrl = jsonObject.getString("varUrl");
detail = jsonObject.getString("detail");
apkName = jsonObject.getString("apkname");
int code = Integer.parseInt(verCode);
if (code > AppUtils.getVersionCode(context)) {
return true;
}
} catch (JSONException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
}
return false;
}
private String getJsonContent(String urlStr) {
try {
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
// 设置连接属性
httpConn.setConnectTimeout(3000);
httpConn.setDoInput(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
if (200 == httpConn.getResponseCode()) {
return ConvertStream2Json(httpConn.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
private String ConvertStream2Json(InputStream inputStream) {
String jsonStr = "";
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
try {
while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, len);
}
jsonStr = new String(out.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return jsonStr;
}
public String getDetail() {
return detail;
}
Thread mThread;
boolean isDownloading = false;
public void startDownloadThread() {
final String urlStr = varUrl;
final String fileName = apkName;
mThread = new Thread() {
public void run() {
isDownloading = true;
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 获得文件的长度
int contentLength = conn.getContentLength();
mHandler.obtainMessage(0, contentLength).sendToTarget();
File filePath = new File(Environment.getExternalStorageDirectory() + "/apk/");
if (!filePath.exists()) {
filePath.mkdirs();
filePath = new File(Environment.getExternalStorageDirectory() + "/apk/" + "/.test.txt");
if (!filePath.exists())
try {
filePath.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileNotification.updateNotify(filePath);
}
String pathName = Environment.getExternalStorageDirectory() + "/apk/" + fileName;
downloadFile = new File(pathName);
InputStream input = conn.getInputStream();
if (downloadFile.exists()) {
downloadFile.delete();
}
downloadFile.createNewFile();
FileOutputStream output = new FileOutputStream(downloadFile);
byte[] buffer = new byte[1024];
int len; // 重要参数
int sum = 0;
while ((len = input.read(buffer)) != -1 && isDownloading) {
sum += len;
mHandler.obtainMessage(1, sum).sendToTarget();
output.write(buffer, 0, len);
Thread.sleep(1);
}
output.close();
input.close();
mHandler.obtainMessage(2).sendToTarget();
} catch (IOException e1) {
mHandler.obtainMessage(3).sendToTarget();
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
mThread.start();
}
/**
* 安装APK文件
*/
public void installApk() {
if (downloadFile != null && !downloadFile.exists()) {
return;
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + downloadFile.toString()),
"application/vnd.android.package-archive");
mContext.startActivity(i);
}
}