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)、效果图展示:
相关文章推荐
- Activity生命周期详解
- android之actionbar 入门
- Android接收彩信时解析PDU的过程记录
- Android开发 ActivityGroupd应用底部导航栏
- Android 多线程及多线程中更新控件。
- android106 C基本数据类型
- Android的线程与线程池
- Android多线程编程
- Android View 事件分发处理流程
- Android项目重构之路:实现篇
- Android整合SlidingMenu和Actionbarsherlock解决Actionbar的冲突
- Android项目重构之路:界面篇
- android四大组件之Service 简单音乐播放器
- android中可能造成内存泄露的几种方式
- Android 省市县 三级联动(android-wheel的使用)
- Android回调机制
- Android 数据存储——Saving Files
- Android SlidingMenu 使用详解
- Android相对布局RelativeLayout
- Android开发之旅一初识Activity