您的位置:首页 > 移动开发 > Android开发

Android 自动检测更新apk版本

2015-11-19 22:14 573 查看

Android 自动检测更新apk版本

1)、功能类实现
public class UpdateManager {
private ProgressBar mProgressBar;//进度条
private TextView tv1;
private TextView tv2;
private Dialog mDownloadDialog;//对话框

private String mSavePath;//apk保存地址
private int mProgress;//进度值

private boolean mIsCancel = false;//是否取消下载标示符

private static final int DOWNLOADING = 1;//apk下载中
private static final int DOWNLOAD_FINISH = 2;//apk下载完毕
private float length;

private static final String PATH = "http://www.jcpeixun.com/app_client_api/app_version.aspx";//更新地址

private String mVersion_code;//软件升级标示号
private String mVersion_name = "开心ing.apk";//apk名
private String mVersion_desc;//更新详情
private String mVersion_path;//apk下载地址

private Context mContext;//上下文

public UpdateManager(Context context) {
mContext = context;
}

private Handler mGetVersionHandler = new Handler(){
public void handleMessage(Message msg) {
JSONObject jsonObject = (JSONObject) msg.obj;
System.out.println(jsonObject.toString());
Log.e("----------",jsonObject.toString());
try {
mVersion_code = jsonObject.getString("version");
//mVersion_name = jsonObject.getString("version_name");
//mVersion_desc = jsonObject.getString("version_desc");
mVersion_path = jsonObject.getString("downurl");

Log.e("version ",jsonObject.getString("version"));
Log.e("downurl ",jsonObject.getString("downurl"));

if (isUpdate()){
//Toast.makeText(mContext, "需要更新", Toast.LENGTH_SHORT).show();
// 显示提示更新对话框
showNoticeDialog();
} else{
Toast.makeText(mContext, "已是最新版本", Toast.LENGTH_SHORT).show();

}

} catch (Exception e){
e.printStackTrace();
}
};
};

private Handler mUpdateProgressHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what){
case DOWNLOADING:
// 设置进度条
mProgressBar.setProgress(mProgress);
tv1.setText( mProgress + "/100");
float len = length/1024/1024;//将length转换为M单位
float b = (float)(Math.round(len*100))/100;//保留两位小数点
tv2.setText( b+"M");
break;
case DOWNLOAD_FINISH:
// 隐藏当前下载对话框
mDownloadDialog.dismiss();
// 安装 APK 文件
installAPK();
}
};
};

/*
* 检测软件是否需要更新
*/
public void checkUpdate() {
RequestQueue requestQueue = Volley.newRequestQueue(mContext);
JsonObjectRequest request = new JsonObjectRequest(PATH, null, new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Message msg = Message.obtain();
msg.obj = jsonObject;
mGetVersionHandler.sendMessage(msg);

}

}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
System.out.println(arg0.toString());
}
});
requestQueue.add(request);
}

/*
* 与本地版本比较判断是否需要更新
*/
protected boolean isUpdate() {
//int serverVersion = Integer.parseInt(mVersion_code);
double serverVersion = Double.parseDouble(mVersion_code);
double localVersion = 1;

try {
//获得当前apk版本号versionCode
localVersion = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (serverVersion > localVersion)
return true;
else
return false;
}

/*
* 有更新时显示提示对话框
*/
protected void showNoticeDialog() {
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle("提示");
String message = "软件有更新,要下载安装吗?\n" + mVersion_desc;
builder.setMessage(message);

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();
}
});

builder.create().show();
}

/*
* 显示正在下载对话框
*/
protected void showDownloadDialog() {
AlertDialog.Builder builder = new Builder(mContext);
builder.setTitle("下载中");
View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_progress, null);
mProgressBar = (ProgressBar) view.findViewById(R.id.id_progress);
tv1 = (TextView) view.findViewById(R.id.tv1);
tv2 = (TextView) view.findViewById(R.id.tv2);
builder.setView(view);

// 设置按钮(左)
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 隐藏当前对话框
dialog.dismiss();
// 设置下载状态为取消
mIsCancel = true;
}
});
// 设置按钮(右)
builder.setNeutralButton("隐藏", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});

mDownloadDialog = builder.create();
mDownloadDialog.show();

// 下载文件
downloadAPK();
}

/*
* 开启新线程下载文件
*/
private void downloadAPK() {
new Thread(new Runnable() {
@Override
public void run() {
try{//检查sd是否挂载
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String sdPath = Environment.getExternalStorageDirectory() + "/";
mSavePath = sdPath + "MyDownload";

File dir = new File(mSavePath);
if (!dir.exists())
dir.mkdir();
// 下载文件
HttpURLConnection conn = (HttpURLConnection) new URL(mVersion_path).openConnection();
conn.connect();
InputStream is = conn.getInputStream();
length = conn.getContentLength();
File apkFile = new File(mSavePath, mVersion_name);
FileOutputStream fos = new FileOutputStream(apkFile);

int count = 0;
byte[] buffer = new byte[1024];
while (!mIsCancel){
int numread = is.read(buffer);
count += numread;
// 计算进度条的当前位置
mProgress = (int) ((count/length) * 100);
// 更新进度条
mUpdateProgressHandler.sendEmptyMessage(DOWNLOADING);

// 下载完成
if (numread < 0){
mUpdateProgressHandler.sendEmptyMessage(DOWNLOAD_FINISH);
break;
}
fos.write(buffer, 0, numread);
}
fos.close();
is.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}).start();
}

/*
* 下载到本地后执行安装
*/
protected void installAPK() {
File apkFile = new File(mSavePath, mVersion_name);
if (!apkFile.exists())
return;

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file://" + apkFile.toString());
intent.setDataAndType(uri, "application/vnd.android.package-archive");
mContext.startActivity(intent);

}

}

2)、进度条对话框布局dialog_progress.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<ProgressBar
android:id="@+id/id_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="14dp"
android:layout_marginLeft="7dp"
android:layout_marginRight="7dp"
android:layout_marginTop="5dp"
android:progress="14" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="14dp"
android:orientation="horizontal">

<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_weight="1"
android:gravity="left|center"
android:text="左"
android:textSize="16dp" />

<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:gravity="right|center"
android:text="右"
android:textSize="16dp" />
</LinearLayout>
</LinearLayout>

3)、调用实现
new UpdateManager(this).checkUpdate();

4)、原项目视频地址:http://www.jikexueyuan.com/course/1607.html

5)、效果图展示:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: