文档章节

安卓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
长沙
私信 提问
[Android] App Widgets-窗口小部件-partI

应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget。可以容纳其它App...

android技术开发
2013/07/30
419
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 Widgets)

http://blog.csdn.net/iefreer/article/details/4626274# 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收...

鲜鲜
2014/09/16
0
0
Google Play 停止上架针对旧版安卓 API 设计的 APP

谷歌对于安卓碎片化的现状非常不满,这不仅仅影响到 Android 的版本升级,新功能推广,对于用户安全也有很大的威胁,由于老版本 Android 已经失去维护,它们没办法接收到新的安全更新,很容易...

局长
2018/11/03
893
4
安卓 10 岁了:这些消失的经典 APP 你还记得吗?

不知不觉,安卓系统已经迈入到第十个年头了。在很多老网友的印象中,iOS和安卓两大系统纵横移动市场,似乎也就是这几年的事,但仔细一查历史,2008年9月正式发布的安卓,已经是实打实十周岁的...

局长
2017/10/09
5.4K
25

没有更多内容

加载失败,请刷新页面

加载更多

CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
1
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
2
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
3
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
3
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部