文档章节

安卓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 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
升级之前必看,关于安卓P的几大新特性,你知道吗?

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

人工智能那点事
08/10
0
0
Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)

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

codeGoogle
04/28
0
0
Android开发指南-窗口小部件(App Widgets)

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

鲜鲜
2014/09/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
7分钟前
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
9分钟前
0
0
Nginix开启SSL支持HTTPS访问(自签名方法)

Nginix开启SSL支持HTTPS访问(自签名方法) 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器...

openthings
25分钟前
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0
jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部