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 com.google.gson.Gson;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 com.lidroid.xutils.http.client.HttpRequest.HttpMethod;import com.szy.update.untity.VerEntity;import android.app.AlertDialog;import android.app.Dialog;import android.app.AlertDialog.Builder;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.DialogInterface.OnClickListener;import android.content.pm.PackageManager.NameNotFoundException;import android.net.Uri;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.widget.ProgressBar;import android.widget.Toast;/** *@author coolszy *@date 2012-4-26 *@blog http://blog.92coding.com *此页面为逻辑实现页面,需Activity中调用checkUpdate()方法为此类逻辑入口 */public class UpdateManager{    /* 下载中 */    private static final int DOWNLOAD = 1;    /* 下载结束 */    private static final int DOWNLOAD_FINISH = 2;    /* 下载保存路径 */    private String mSavePath;    /* 记录进度条数量 */    private int progress;    /* 是否取消更新 */    private boolean cancelUpdate = false;    private Context mContext;    /* 更新进度条 */    private ProgressBar mProgress;    private Dialog mDownloadDialog;    private Handler mHandler = new Handler()    {        public void handleMessage(Message msg)        {            switch (msg.what)            {                // 正在下载                case DOWNLOAD:                    // 设置进度条位置                    mProgress.setProgress(progress);                    break;                case DOWNLOAD_FINISH:                    // 安装文件                    installApk();                    break;                default:                    break;            }        };    };    public UpdateManager(Context context)    {        this.mContext = context;    }    /**     * 检测软件更新,     */    public void checkUpdate()    {        if (isUpdate())        {            // 显示提示对话框            showNoticeDialog();        } else        {            Toast.makeText(mContext, "已经是最新版本", Toast.LENGTH_LONG).show();        }    }    /**     * 检查软件是否有更新版本     *     * @return     */    private boolean isUpdate(){        String url = "http://172.16.16.21:8080/postTest/index.jsp";//服务端地址        HttpUtils httpUtils=new HttpUtils();        httpUtils.send(HttpMethod.POST,url, null, new RequestCallBack() {            @Override            public void onFailure(HttpException arg0, String arg1) {                Toast.makeText(mContext, "服务器请求失败,发生未知异常错误", 1).show();            }            @Override            public void onSuccess(ResponseInfo arg0) {                String jsonData = arg0.result+"";                //解析服务端返回数据,这里用户可自行设置,我这里返回的是json                Gson gson = new Gson();                VerEntity en = gson.fromJson(jsonData, VerEntity.class);                MyApp.setCode( en.getVersion());                MyApp.setUrl(en.getUrl());                MyApp.setName(en.getName());            }        });        // 获取当前软件版本        int versionCode = getVersionCode(mContext);      /*       * MyApp.code为服务端apk文件版本,此处也可写为不等于       */        if (MyApp.getCode() <= versionCode)        {            return false;        }else {            return true;        }    }    /**     * 获取软件版本号     *     * @param context     * @return     */    private int getVersionCode(Context context)    {        int versionCode = 0;        try        {            // 获取软件版本号,对应AndroidManifest.xmlandroid:versionCode            versionCode = context.getPackageManager().getPackageInfo("com.szy.update", 0).versionCode;        } catch (NameNotFoundException e)        {            e.printStackTrace();        }        return versionCode;    }    /**     * 显示软件更新对话框     */    private void showNoticeDialog()    {        // 构造对话框        AlertDialog.Builder builder = new Builder(mContext);        builder.setTitle(R.string.soft_update_title);        builder.setMessage(R.string.soft_update_info);        // 更新        builder.setPositiveButton(R.string.soft_update_updatebtn, new OnClickListener()        {            @Override            public void onClick(DialogInterface dialog, int which)            {                dialog.dismiss();                // 显示下载对话框                showDownloadDialog();            }        });        // 稍后更新        builder.setNegativeButton(R.string.soft_update_later, new OnClickListener()        {            @Override            public void onClick(DialogInterface dialog, int which)            {                dialog.dismiss();            }        });        Dialog noticeDialog = builder.create();        noticeDialog.show();    }    /**     * 显示软件下载对话框     */    private void showDownloadDialog()    {        // 构造软件下载对话框        AlertDialog.Builder builder = new Builder(mContext);        builder.setTitle(R.string.soft_updating);        // 给下载对话框增加进度条        final LayoutInflater inflater = LayoutInflater.from(mContext);        View v = inflater.inflate(R.layout.softupdate_progress, null);        mProgress = (ProgressBar) v.findViewById(R.id.update_progress);        builder.setView(v);        // 取消更新        builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener()        {            @Override            public void onClick(DialogInterface dialog, int which)            {                dialog.dismiss();                // 设置取消状态                cancelUpdate = true;            }        });        mDownloadDialog = builder.create();        mDownloadDialog.show();        // 现在文件        downloadApk();    }    /**     * 下载apk文件     */    private void downloadApk()    {        // 启动新线程下载软件        new downloadApkThread().start();    }    /**     * 下载文件线程     *     * @author coolszy     *@date 2012-4-26     *@blog http://blog.92coding.com     */    private class downloadApkThread extends Thread    {        @Override        public void run()        {            try            {                // 判断SD卡是否存在,并且是否具有读写权限                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))                {                    // 获得存储卡的路径                    String sdpath = Environment.getExternalStorageDirectory() + "/";                    mSavePath = sdpath + "download";                    //URL url = new URL(list.get(0).getUrl());                    URL url = new URL(MyApp.getUrl());                    // 创建连接                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();                    conn.connect();                    // 获取文件大小                    int length = conn.getContentLength();                    // 创建输入流                    InputStream is = conn.getInputStream();                    File file = new File(mSavePath);                    // 判断文件目录是否存在                    if (!file.exists())                    {                        file.mkdir();                    }                    File apkFile = new File(mSavePath, MyApp.getName());                    FileOutputStream fos = new FileOutputStream(apkFile);                    int count = 0;                    // 缓存                    byte buf[] = new byte[1024];                    // 写入到文件中                    do                    {                        int numread = is.read(buf);                        count += numread;                        // 计算进度条位置                        progress = (int) (((float) count / length) * 100);                        // 更新进度                        mHandler.sendEmptyMessage(DOWNLOAD);                        if (numread <= 0)                        {                            // 下载完成                            mHandler.sendEmptyMessage(DOWNLOAD_FINISH);                            break;                        }                        // 写入文件                        fos.write(buf, 0, numread);                    } while (!cancelUpdate);// 点击取消就停止下载.                    fos.close();                    is.close();                }            } catch (MalformedURLException e)            {                e.printStackTrace();            } catch (IOException e)            {                e.printStackTrace();            }            // 取消下载对话框显示            mDownloadDialog.dismiss();        }    };    /**     * 安装APK文件     */    private void installApk()    {        File apkfile = new File(mSavePath, MyApp.getName());        if (!apkfile.exists())        {            return;        }        // 通过Intent安装APK文件        Intent i = new Intent(Intent.ACTION_VIEW);        i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");        mContext.startActivity(i);    }

更多相关文章

  1. Android布局文件.xml中的自定义属性
  2. Android(安卓)中的 AndroidManifest.xml文件
  3. android反射获取资源
  4. android文件管理器--界面效果二(layout)
  5. android 颜色大全 color文件
  6. 实用正则表达式扫描android SDcard的文件
  7. Android中常用工具类
  8. Layer_list(层叠图片)
  9. SwipeRefreshLayout使用

随机推荐

  1. Android的常用传感器
  2. Android(安卓)DEX安全攻防战
  3. 可下拉的PinnedHeaderExpandableListView
  4. 打包Android程序—Android跟我学2.2
  5. android开发资料(DEVELOPER.ANDROID.COM/
  6. Android(安卓)密码的隐藏和显示
  7. Android Drawable Resources系列5:
  8. Android 顶部下拉刷新添加数据&& 底部上
  9. Android(安卓)studio使用lambda表达式
  10. 学习:Android框架