`
android_madness
  • 浏览: 40898 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

版本检测和更新(转)

阅读更多
版本检测和更新是每个应用程序必须做的一个功能,所以在这里晒下:




import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.URL;

import java.net.URLConnection;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.ProgressDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager.NameNotFoundException;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.net.Uri;

import android.util.Log;

import android.webkit.URLUtil;

import com.autoupdate.R;


/**

* 版本检测,自动更新

* 
* @author shenyj-ydrh 1.通过Url检测更新 2.下载并安装更新 3.删除临时路径

* 
*/

public class MyAutoUpdate {

        // 调用更新的Activity

        public Activity activity = null;

        // 当前版本号

        public int versionCode = 0;

        // 当前版本名称

        public String versionName = "";

        // 控制台信息标识

        private static final String TAG = "AutoUpdate";

        // 文件当前路径

        private String currentFilePath = "";

        // 安装包文件临时路径

        private String currentTempFilePath = "";

        // 获得文件扩展名字符串

        private String fileEx = "";

        // 获得文件名字符串

        private String fileNa = "";

        // 服务器地址

        private String strURL = "http://127.0.0.1:8080/ApiDemos.apk";

        private ProgressDialog dialog;


        /**

         * 构造方法,获得当前版本信息

         * 
         * @param activity

         */

        public MyAutoUpdate(Activity activity) {

                this.activity = activity;

                // 获得当前版本

                getCurrentVersion();

        }


        /**

         * 检测更新

         */

        public void check() {

                // 检测网络

                if (isNetworkAvailable(this.activity) == false) {

                        return;

                }

                // 如果网络可用,检测到新版本

                if (true) {

                        // 弹出对话框,选择是否需要更新版本

                        showUpdateDialog();

                }

        }


        /**

         * 检测是否有可用网络

         * 
         * @param context

         * @return 网络连接状态

         */

        public static boolean isNetworkAvailable(Context context) {

                try {

                        ConnectivityManager cm = (ConnectivityManager) context

                                        .getSystemService(Context.CONNECTIVITY_SERVICE);

                        // 获取网络信息

                        NetworkInfo info = cm.getActiveNetworkInfo();

                        // 返回检测的网络状态

                        return (info != null && info.isConnected());

                } catch (Exception e) {

                        e.printStackTrace();

                        return false;

                }

        }


        /**

         * 弹出对话框,选择是否需要更新版本

         */

        public void showUpdateDialog() {

                @SuppressWarnings("unused")

                AlertDialog alert = new AlertDialog.Builder(this.activity)

                                .setTitle("新版本").setIcon(R.drawable.ic_launcher)

                                .setMessage("是否更新?")

                                .setPositiveButton("是", new DialogInterface.OnClickListener() {

                                        public void onClick(DialogInterface dialog, int which) {

                                                // 通过地址下载文件

                                                downloadTheFile(strURL);

                                                // 显示更新状态,进度条

                                                showWaitDialog();

                                        }

                                })

                                .setNegativeButton("否", new DialogInterface.OnClickListener() {

                                        public void onClick(DialogInterface dialog, int which) {

                                                dialog.cancel();

                                        }

                                }).show();

        }


        /**

         * 显示更新状态,进度条

         */

        public void showWaitDialog() {

                dialog = new ProgressDialog(activity);

                dialog.setMessage("正在更新,请稍候...");

                dialog.setIndeterminate(true);

                dialog.setCancelable(true);

                dialog.show();

        }


        /**

         * 获得当前版本信息

         */

        public void getCurrentVersion() {

                try {

                        // 获取应用包信息

                        PackageInfo info = activity.getPackageManager().getPackageInfo(

                                        activity.getPackageName(), 0);

                        this.versionCode = info.versionCode;

                        this.versionName = info.versionName;

                } catch (NameNotFoundException e) {

                        e.printStackTrace();

                }

        }


        /**

         * 截取文件名称并执行下载

         * 
         * @param strPath

         */

        private void downloadTheFile(final String strPath) {

                // 获得文件文件扩展名字符串

                fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length())

                                .toLowerCase();

                // 获得文件文件名字符串

                fileNa = strURL.substring(strURL.lastIndexOf("/") + 1,

                                strURL.lastIndexOf("."));

                try {

                        if (strPath.equals(currentFilePath)) {

                                doDownloadTheFile(strPath);

                        }

                        currentFilePath = strPath;

                        new Thread(new Runnable() {


                                @Override

                                public void run() {

                                        // TODO Auto-generated method stub

                                        try {

                                                // 执行下载

                                                doDownloadTheFile(strPath);

                                        } catch (Exception e) {

                                                Log.e(TAG, e.getMessage(), e);

                                        }

                                }

                        }).start();

                } catch (Exception e) {

                        e.printStackTrace();

                }

        }


        /**

         * 执行新版本进行下载,并安装

         * 
         * @param strPath

         * @throws Exception

         */

        private void doDownloadTheFile(String strPath) throws Exception {

                Log.i(TAG, "getDataSource()");

                // 判断strPath是否为网络地址

                if (!URLUtil.isNetworkUrl(strPath)) {

                        Log.i(TAG, "服务器地址错误!");

                } else {

                        URL myURL = new URL(strPath);

                        URLConnection conn = myURL.openConnection();

                        conn.connect();

                        InputStream is = conn.getInputStream();

                        if (is == null) {

                                throw new RuntimeException("stream is null");

                        }

                        //生成一个临时文件 
                        File myTempFile = File.createTempFile(fileNa, "." + fileEx);

                        // 安装包文件临时路径

                        currentTempFilePath = myTempFile.getAbsolutePath();

                        FileOutputStream fos = new FileOutputStream(myTempFile);

                        byte buf[] = new byte[128];

                        do {

                                int numread = is.read(buf);

                                if (numread <= 0) {

                                        break;

                                }

                                fos.write(buf, 0, numread);

                        } while (true);

                        Log.i(TAG, "getDataSource() Download  ok...");

                        dialog.cancel();

                        dialog.dismiss();

                        // 打开文件

                        openFile(myTempFile);

                        try {

                                is.close();

                        } catch (Exception ex) {

                                Log.e(TAG, "getDataSource() error: " + ex.getMessage(), ex);

                        }

                }

        }


        /**

         * 打开文件进行安装

         * 
         * @param f

         */

        private void openFile(File f) {

                Intent intent = new Intent();

                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                intent.setAction(android.content.Intent.ACTION_VIEW);

                // 获得下载好的文件类型

                String type = getMIMEType(f);

                // 打开各种类型文件

                intent.setDataAndType(Uri.fromFile(f), type);

                // 安装

                activity.startActivity(intent);

        }


        /**

         * 删除临时路径里的安装包

         */

        public void delFile() {

                Log.i(TAG, "The TempFile(" + currentTempFilePath + ") was deleted.");

                File myFile = new File(currentTempFilePath);

                if (myFile.exists()) {

                        myFile.delete();

                }

        }


        /**

         * 获得下载文件的类型

         * 
         * @param f

         *            文件名称

         * @return 文件类型

         */

        private String getMIMEType(File f) {

                String type = "";

                // 获得文件名称

                String fName = f.getName();

                // 获得文件扩展名

                String end = fName

                                .substring(fName.lastIndexOf(".") + 1, fName.length())

                                .toLowerCase();

                if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")

                                || end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {

                        type = "audio";

                } else if (end.equals("3gp") || end.equals("mp4")) {

                        type = "video";

                } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")

                                || end.equals("jpeg") || end.equals("bmp")) {

                        type = "image";

                } else if (end.equals("apk")) {

                        type = "application/vnd.android.package-archive";

                } else {

                        type = "*";

                }

                if (end.equals("apk")) {

                } else {

                        type += "/*";

                }

                return type;

        }

}


分享到:
评论

相关推荐

    max高版本转低版本插件

    2. **数据格式变化**:随着软件的更新,内部数据格式可能会发生变化,这可能导致低版本无法识别高版本文件。 3. **丢失细节**:在转换过程中,某些高版本特有的细节或设置可能会丢失。 4. **插件冲突**:高版本可能...

    Visual Studio 项目版本之间转换

    在IT行业中,开发工具的更新迭代是常态,Visual Studio(VS)作为微软推出的强大集成开发环境,也经历了多个版本的升级。"Visual Studio 项目版本之间转换"这一主题,涉及的是如何在不同版本的VS之间迁移和管理项目...

    魔兽版本转换,冰封王座版本转换,war3版本转换

    选择所需版本,按照提示操作,等待片刻,游戏就会被更新到选定的版本。 需要注意的是,转换版本可能会对游戏的存档和自定义地图产生影响。有些较旧的地图可能无法在新版本中正常运行,反之亦然。因此,建议在转换前...

    Haclon脏污检测(更新版)

    《Haclon脏污检测(更新版):深入理解屏幕缺陷检测...不断更新迭代的版本,证明了其在应对屏幕缺陷检测挑战方面的决心与实力。随着科技的进步,我们可以期待它在未来发挥更大的作用,推动整个行业的质量标准不断提升。

    mxd文件批量版本高转低

    2. **版本检测**:程序需要能够读取MXD文件的元数据,确定其当前版本,然后与目标版本进行比较。 3. **转换逻辑**:使用ARCGIS的ArcObjects库,该库提供了对ARCGIS内部对象模型的访问,包括MXD文件。通过编程接口...

    JDK 1.6 32和64(附带检测安装JDK版本方法)

    在这个版本中,JDK支持32位和64位操作系统,这使得开发者可以根据自己的硬件环境选择合适的版本。 **1. JDK的组成部分** JDK主要由以下几个部分组成: - **Java编译器(javac)**:用于将源代码转换为字节码的工具...

    基于YOLOv5的旋转目标检测系统源码+模型.zip

    YOLOv5在前几代的基础上进行了多方面的改进,包括网络结构的优化、训练策略的更新以及损失函数的设计,从而在速度和精度之间取得了更好的平衡。 在"基于YOLOv5的旋转目标检测系统源码+模型.zip"这个压缩包中,包含...

    Microsoft Visual Studio版本转换

    此过程会更新项目文件的格式和配置,以适应新版本的要求。 2. **转换风险**:虽然自动转换通常是安全的,但并非所有项目都可无缝转换。某些旧特性可能在新版本中已被弃用,或者新版本可能引入了与旧代码不兼容的...

    51单片机检测光电旋转编码器

    - **定时器0中断服务程序**:`void timer0() interrupt 1 {...}` 在定时器0中断发生时,更新定时器0的值,并进行显示逻辑处理,包括选择要显示的数码管段和更新显示数据。 ### 总结 通过以上分析,我们可以看到51...

    基于旋转框的yolov5目标检测算法

    YOLOv5是YOLO系列的最新版本,由Joseph Redmon等人开发,以其高效、准确和易于训练的特点而闻名。它采用了卷积神经网络(CNN)架构,通过单个前向传递就能完成对图像中物体的分类和定位。然而,原版的YOLOv5仅支持...

    Visual Studio 版本互转工具 3.0.0.0 正式版V2(亲测,好用)

    此工具的版本号为3.0.0.0,表明它可能已经经历了多次更新和优化,提供了更为稳定和高效的功能。"正式版V2"的标签暗示这是一次重要的更新迭代,相较于之前的版本,可能引入了新的特性或修复了已知问题。 Visual ...

    Android应用更新之自动检测版本及自动升级

    在Android应用开发中,自动检测版本和自动升级是提高用户体验的重要功能。这使得应用程序能够及时地获取最新的功能和修复,而无需用户手动检查或下载更新。以下是对这一过程的详细解释: 1. **检测当前版本信息**:...

    基于yolov5的旋转目标检测方法

    YOLO(You Only Look Once)是一种高效且准确的目标检测框架,自2016年首次提出以来,经过多次迭代更新,现在已经发展到yolov5版本。本主题聚焦于yolov5在处理旋转目标检测上的应用,这是一个在实际场景中经常遇到的...

    USB转RS232驱动(不同版本)

    2. 安装顺序:通常,应先插入USB转RS232适配器,然后安装驱动程序,让操作系统能够自动检测并安装。 3. 设备管理器检查:如果驱动安装后设备仍然无法正常工作,可以在设备管理器中查看是否存在错误,或者尝试更新...

    易语言利用百度空间检测版本更新源码-易语言

    在“易语言利用百度空间检测版本更新源码”这个主题中,我们将探讨如何使用易语言来实现一个自动检测并提示用户进行版本更新的功能,以及涉及到的网络通信技术和数据解析。 首先,我们需要理解的是版本更新检测的...

    Unity Md5更新版本值设置

    在Unity游戏开发中,版本控制和更新机制是至关重要的部分,确保玩家总是使用最新、最稳定的游戏版本。本文将深入探讨“Unity Md5更新版本值设置”这一主题,以及如何利用工具自动生成文件夹下的所有Md5值进行版本...

    多种目标检测算法

    本文将深入探讨几种常用的目标检测算法,包括背景差分法和混合高斯模型背景建模。 首先,我们来理解背景差分法。这是一种基于静态背景的动态目标检测方法。在监控场景中,背景通常是相对静止的,而目标则是移动的。...

    极致声卡检测器 检测各类声卡

    一是解决音频问题,例如无声、杂音、音量不均等,检测声卡可以快速定位问题所在,从而针对性地更新驱动或者更换硬件。二是优化音质,不同的声卡可能适合不同类型的音频应用,如游戏、音乐制作或电影观看,检测声卡有...

    python+pyqt+软件远程自动检测升级新版本+FTP服务器

    3. 如果找到新版本,提示用户有可用更新,并开始下载新版本的`.exe`。 4. 下载完成后,可以提供一个选项让用户立即安装或选择稍后安装。 5. 用户选择安装时,执行`.exe`文件,完成升级过程。 总的来说,这个实例...

    citrix pvs 桌面vdisk 的更新

    3. **指定更新时间和版本**:可以根据需求设置自动更新的时间以及如何处理不同版本的VDISK。 4. **检测自动更新**:通过右键点击PVS服务器,选择“检测自动更新”来触发更新过程。 5. **刷新设备**:一旦自动更新...

Global site tag (gtag.js) - Google Analytics