文档章节

安卓app更新

sunfish
 sunfish
发布于 2015/10/15 17:56
字数 1308
阅读 25
收藏 1

接上一个获取文件大小的,这个内容是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();
    }
}


© 著作权归作者所有

共有 人打赏支持
sunfish
粉丝 1
博文 28
码字总数 17794
作品 0
长沙
升级之前必看,关于安卓P的几大新特性,你知道吗?

  近日,安卓最新系统Android 9已经正式开始推送升级,Android 9的代号为Android P,在近日确认名为馅饼(pie),首批支持推送更新的机型是Google“亲儿子”Pixel系列,接着便是安卓手机之...

人工智能那点事
08/10
0
0
Android Studio 3.2 Canary 发布,新增大量实用功能

在今天的 Google 2018 I/O 大会上,释出了 Android Studio 3.2 的最新预览版,并带来了一系列的新功能,如支持 Android P 开发预览版、新的 Android App Bundle,以及 Android Jetpack。官方...

局长
05/09
0
0
Android Studio安装注意事项

http://tools.android.com/download/studio/canary 每周都有更新,不内置SDK NOTE: These .zip files do not contain an embedded SDK install. If you have an existing install of Studio ......

wffger
2014/04/08
0
0
android app內切换语言环境

功能:app用户根据自己的语言喜好,设置app语言。语言设置只针对本app,并在下次启动应用时保留前一次启动设置。更新语言: sharePreferences存入设置语言: 语言更新后,对于之前出现且目前仍...

cywaker
2014/02/11
0
0
Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)

一、前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新版本app。在线更新分为以下几个步骤: 在线更新就上面几个步骤,前2步比较简...

codeGoogle
04/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring IOC 之 注册 BeanDefinition

获取 Document 对象后,会根据该对象和 Resource 资源对象调用 registerBeanDefinitions() 方法,开始注册 BeanDefinitions 首先调用 createBeanDefinitionDocumentReader() 方法实例化 Bean...

职业搬砖20年
13分钟前
1
0
Pycahrm左边出现一些bookmark的取消方法

pycharm 左边出一个对号或则一个0,放上去提示Bookmark 取消方法:按F11

鹏灬
16分钟前
0
0
JDK1.8使用Dubbo时需注意

Dubbo自带的很多包都比较旧了,其中的javassist在JDK1.8上运行会报错 而且错误通常比较诡异,javassist是编辑和创建Java字节码的类库,常见的错误会从spring中报出 解决办法: <dependency>...

火龙战士
18分钟前
1
0
Java 对Oracle数据库中的 BLOB类型 插入图片

package test;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.PrintStream;import java.sql.Connection;import java.sql.DriverManager;......

青峰Jun19er
20分钟前
0
0
awk复习

10月22日任务 复习 awk调用外部变量 -v参数设置内部变量调用外部变量 [root@test awk]# a=44[root@test awk]# echo "ABCD" | awk -v GET_A=$a '{print GET_A}'44 更复杂的应用: [root@...

robertt15
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部