安卓app更新

接上一个获取文件大小的,这个内容是app更新了。

else if (v.getId() == R.id.llRefresh) {
    //发送请求前,先判断网络是否可用。
    if (UIHelp.isNetworkConnected(getActivity())) {
        UpdateTask task = new UpdateTask();
        task.execute();
    } else {
        UIHelp.showToast(getActivity(), getActivity().getString(R.string.no_network));
    }

UIHelp.isNetworkConnected(getActivity()是我的工具类用于检查是否有网络。

UIHelp.showToast()是我工具类里面弹吐司的。

UpdateTask 的异步类:

private class UpdateTask extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... params) {
        return ws.Update();
    }

    @Override
    protected void onPostExecute(final String s) {
        super.onPostExecute(s);
        pd.dismiss();
        Log.v(TAG, "result" + s);
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();
                UpdateManager manager = new UpdateManager(getActivity(), s);
                // 检查软件更新
                manager.checkUpdate();
                Looper.loop();
            }
        }.start();
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setMessage("正在获取最新版本信息....");
        pd.setCancelable(false);
        pd.show();
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        pd.dismiss();
    }
}

doInBackground方法里面请求的方法Update():

public String Update(){
    String url = "http://218.77.13.42:81/version.xml";
    SyncHttpClient client = new SyncHttpClient();
    return client.post(url);
}

 总之这个方法就是去发请求的。。。

UpdateManager manager = new UpdateManager(getActivity(), s);
                // 检查软件更新
                manager.checkUpdate();

这里在onPostExecute方法里面得到的s通过构造函数传入。

s其实是一个版本的xml,String类型的。

UpdateManager 整个类如下:

package com.rb.huaihua.util.update;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.rb.huaihua.R;
import com.rb.huaihua.util.UIHelp;

import java.io.ByteArrayInputStream;
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 java.util.HashMap;

/**
 * Created by Administrator on 2015/10/10.
 */
public class UpdateManager  {
    /* 下载中 */
    private static final int DOWNLOAD = 1;
    /* 下载结束 */
    private static final int DOWNLOAD_FINISH = 2;
    private static final String TAG = UpdateManager.class.getSimpleName();
    /* 保存解析的XML信息 */
    HashMap<String, String> mHashMap;
    /* 是否取消更新 */
    private boolean cancelUpdate = false;
    /* 下载保存路径 */
    public static String mSavePath = Environment.getExternalStorageDirectory() + File.separator
    +"richbond"+File.separator+"xssb"+File.separator;
    /* 记录进度条数量 */
    private int progress;
    private Context mContext;
    private ProgressBar mProgress;
    private TextView update_data;
    private Dialog mDownloadDialog;
    private static String apkFilePath = "";
    private String str;//读取到的xml
    /*用于更新进度条、安装文件*/
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                // 正在下载
                case DOWNLOAD:
                    // 设置进度条位置
                    mProgress.setProgress(progress);
                    update_data.setText(progress+"%");
                    break;
                case DOWNLOAD_FINISH:
                    // 安装文件
                    installApk(apkFilePath);
                    break;
                default:
                    break;
            }
        };
    };

    public UpdateManager(Context context,String str)
    {
        this.mContext = context;
        this.str=str;
    }

    /**
     * 检测软件更新
     */
    public void checkUpdate()
    {
        if (isUpdate())
        {
            // 显示提示对话框
            showNoticeDialog();
        } else
        {
            UIHelp.showToast(mContext, mContext.getString(R.string.soft_update_no));
        }
    }
    /**
     * 检查软件是否有更新版本
     *
     * @return
     */
    private boolean isUpdate()
    {/**
     * 使用流读取 classpath 下文件:
     * 1.Android Studio Terminal
     * 2.cd appname\src\main\java
     * 3.jar cvf xml.jar persons.xml
     * 4.move xml.jar E:\AndroidStudio\Projects\Apps\appname\libs
     */
        // 获取当前软件版本
        int versionCode = getVersionCode(mContext);
        Log.v(TAG,"versionCode = "+versionCode);
        // 把version.xml放到网络上,然后获取文件信息
        try {
            //InputStream inStream = mContext.getAssets().open("version.xml");
            //InputStream inStream = mContext.getAssets().open("version.xml");
            /*String str = "<update>\n" +
                    "\t<version>2</version>\n" +
                    "\t<name>baidu_xinwen_1.1.0</name>\n" +
                    "\t<url>http://gdown.baidu.com/data/wisegame/f98d235e39e29031/baiduxinwen.apk</url>\n" +
                    "</update>";*/
            ByteArrayInputStream inStream = new ByteArrayInputStream(str.getBytes());
            Log.v(TAG,"is = "+inStream);

        //InputStream inStream = getClass().getClassLoader().getResourceAsStream("version.xml");
        //Log.v(TAG,"inStream = "+inStream);
        // 解析XML文件。 由于XML文件比较小,因此使用DOM方式进行解析
        ParseXmlService service = new ParseXmlService();

            mHashMap = service.parseXml(inStream);

        } catch (Exception e)
        {
            e.printStackTrace();
        }
        if (null != mHashMap)
        {
            Log.v(TAG,"mHashMap = "+mHashMap.toString());
            int serviceCode = Integer.valueOf(mHashMap.get("version"));
            // 版本判断
            if (serviceCode > versionCode)
            {
                return true;
            }
        }

        return false;
    }

    /**
     * 获取软件版本号
     *
     * @param context
     * @return
     */
    public int getVersionCode(Context context)
    {
        int versionCode = 0;
        try {
            // 获取软件版本号,对应AndroidManifest.xml下android:versionCode
            versionCode = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0).versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }

    /**
     * 显示软件更新对话框
     */
    private void showNoticeDialog()
    {
        // 构造对话框
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle(R.string.soft_update_title);
        builder.setMessage(R.string.soft_update_info);
        //按对话框以外的地方不起作用。按返回键也不起作用
        builder.setCancelable(false);
        // 更新
        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 AlertDialog.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);
        update_data = (TextView) v.findViewById(R.id.update_data);
        update_data.setText("0%");
        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.setCanceledOnTouchOutside(false);
        mDownloadDialog.show();
        // 下载文件
        downloadApk();
    }

    /**
     * 下载apk文件
     */
    private void downloadApk()
    {
        // 启动新线程下载软件
        new downloadApkThread().start();
    }

    /**
     * 下载文件线程
     */
    private class downloadApkThread extends Thread
    {
        @Override
        public void run()
        {
            try
            {
                // 判断SD卡是否存在,并且是否具有读写权限
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                    apkFilePath = mSavePath + mHashMap.get("name")+".apk";
                    Log.v(TAG,"mSavePath"+mSavePath);
                    URL url = new URL(mHashMap.get("url"));
                    Log.v(TAG,"url="+mHashMap.get("url"));
                    // 创建连接
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.connect();
                    // 获取文件大小
                    int length = conn.getContentLength();

                    File file = new File(mSavePath);
                    // 判断文件目录是否存在
                    if (!file.exists())
                    {
                        file.mkdir();
                    }

                    File apkFile = new File(apkFilePath);
                    if (apkFile.exists()){
                        if (apkFile.length()==length){
                            //安装文件
                            installApk(apkFilePath);
                            mDownloadDialog.dismiss();
                            conn.disconnect();
                            return;
                        }
                        //删除文件
                        apkFile.delete();
                    }
                    // 创建输入流
                    InputStream is = conn.getInputStream();
                    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);// 点击取消就停止下载.
                    conn.disconnect();
                    fos.close();
                    is.close();
                }
                else{
                    //吐司提示没有sd卡
                    new Thread() {
                        @Override
                        public void run() {
                            Looper.prepare();
                            UIHelp.showToast(mContext, mContext.getString(R.string.no_sdCard));
                            Looper.loop();
                        }
                    }.start();

                }
            } catch (MalformedURLException e) {
                Log.v(TAG,"urlException进入了这个异常");
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 取消下载对话框显示
            mDownloadDialog.dismiss();
        }
    };

    /**
     * 安装APK文件
     */
    private void installApk(String apkFilePath)
    {
        File apkfile = new File(apkFilePath);
        if (!apkfile.exists())
        {
            return;
        }
        // 通过Intent安装APK文件
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
        mContext.startActivity(intent);
        //apkfile.delete();
    }
    /**
     * 删除apk文件
     */
    public static void deleteApk(){
        //File apkfile = new File(apkFilePath);///storage/sdcard0/richbond/xssb/xssb_1.1.0.apk
        File apkfile = new File("/storage/sdcard0/richbond/xssb/xssb_1.1.0.apk");
        if (!apkfile.exists())
        {
            return;
        }
        apkfile.delete();
    }
}


转载于:https://my.oschina.net/u/2473169/blog/517700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值