`

Android版本检测与更新

阅读更多
package com.autoupdate;

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;
        }
}
分享到:
评论

相关推荐

    android版本更新 demo

    这个“android版本更新 demo”项目旨在展示如何实现一个有效的版本更新系统,包括检查新版本、下载更新包以及自动升级等功能。以下是对这些关键知识点的详细解释: 1. **版本控制**:在Android应用开发中,版本控制...

    android检测版本更新

    android是当今移动互联网最受欢迎的一门编程语言,互联网移动产品愈来愈多,版本更新成为一个必不可少的环节,本资源提供一个jar包来读取apk的配置文件来检测版本更新。

    Android版本检测安装

    本文将深入探讨Android版本检测安装的相关知识点,并提供实际操作的指导。 首先,了解Android版本检测的基本原理。Android系统有不同的版本,如KitKat、Lollipop、Marshmallow、Nougat、Oreo、Pie、Q、R等,每个...

    android app版本自动检测、更新

    在实际开发中,确保更新功能在不同网络环境、设备和Android版本上都能正常工作,发布新版本时,要遵循Google Play Store或自建应用市场的更新规范。 总之,Android应用的版本自动检测和更新涉及到多个开发环节,...

    android 版本更新 简单易用

    "Android版本更新简单易用"这一主题,意味着我们将探讨如何轻松地进行Android系统的升级,以及新版本带来的各种改进和功能。 Android系统更新通常包含了对旧版本问题的修复,新的用户界面设计,性能优化,以及对...

    android 版本更新DEMO

    1. **版本检测服务**:在后台运行的服务会定期检查服务器上的更新信息,如新版本号、更新日志和下载链接。这通常通过HTTP请求实现,服务可能会使用`AsyncTask`或者`WorkManager`来避免阻塞主线程。 2. **版本比较...

    Android检测版本更新

    本文将深入探讨如何在Android中实现版本检测更新的机制。 首先,我们需要理解版本更新的基本流程:检查服务器上的最新版本信息,对比本地应用的版本号,如果存在新版本,提示用户进行更新。这一过程主要涉及网络...

    android版本自动更新

    此外,可以提供手动检查更新的选项,让用户自行决定何时更新。 9. **更新策略**:开发者还可以选择强制更新或可选更新。强制更新通常用于修复严重安全问题,而可选更新则留给用户自行决定。 10. **测试与调试**:...

    基于Android的XUpdate版本更新框架.zip

    XUpdate 是一个轻量级、高可用性的Android版本更新框架,旨在简化应用版本更新的流程,提供灵活的配置和友好的用户界面。 特征 支持POST和GET两种版本检查方式,支持自定义网络请求。 支持设置只在WiFi下进行...

    Android版本更新(检测、升级),检测版本,通过apk路径下载安装包

    本文将详细探讨如何在Android系统中实现版本检测、下载以及安装的过程,确保用户能够及时获取到最新的应用版本。 首先,我们要实现版本检测。这通常涉及到服务器端与客户端的交互。服务器上会存储当前最新版本的...

    Android版本更新项目源码

    - 项目源码可能包含`VersionCheck`类用于检查更新,`Downloader`类负责下载,`NotificationManager`处理用户通知,以及相关的布局文件和资源。 通过这个"版本更新Demo",开发者可以学习到如何在Android应用中实现...

    安卓Android源码——版本检测自动更新.zip

    在安卓(Android)开发中,版本检测和自动更新是至关重要的功能,它允许应用程序自动检测新版本并提示用户进行更新,以确保应用始终运行在最新、最安全的版本上。这个压缩包“安卓Android源码——版本检测自动更新....

    Android App 版本更新完美适配7.0、8.0, 兼容Android7.0 8.0

    在Android应用开发中,随着操作系统版本的迭代更新,开发者必须确保他们的应用程序能够在不同的Android版本上运行无误。本文将深入探讨如何实现“Android App版本更新完美适配7.0、8.0”,以及如何实现对Android 7.0...

    Android APP版本更新源码

    首先,我们需要理解Android版本更新的基本流程。通常,这个过程包括检查新版本、下载更新文件(如APK)以及安装更新。以下步骤详细阐述了这一过程: 1. **检查新版本**: - 服务器端维护一个版本信息文件,包含...

    android 版本更新 同时清除旧版本数据

    8. 版本兼容性:在设计更新逻辑时,必须考虑到不同Android版本间的兼容性,确保更新过程在各个版本上都能顺畅进行。 通过以上步骤,我们可以实现Android应用的智能版本更新,并在更新过程中确保旧版本数据的正确...

    android版本更新完整版

    "android版本更新完整版"这个标题暗示我们将讨论一个全面的Android系统更新过程,包括从下载到安装的每一个环节。 首先,"支持断点下载"是指在下载过程中,如果因为网络中断或其他原因导致下载暂停,系统能够记住...

    Android项目版本检测自动更新.rar

    1. **版本检测**:在Android应用中,通常会在启动时或者在后台定期检查服务器上的最新版本信息。这可以通过发送HTTP请求到服务器上的API来完成,API返回当前应用商店中的最新版本号、更新日志和下载链接。在客户端,...

    android版本检查更新demo server activity两种方式

    本文将详细介绍两种在Android中实现版本检查更新的方式,并通过一个名为NiceyooDemo的示例项目进行阐述。这个Demo的源代码可以从提供的链接(http://blog.csdn.net/niceyoo/article/details/72674466)获取。 首先...

    Android版本更新+附源代码

    1. **检测更新**:应用启动时或用户触发检查更新时,应用向服务器发送请求,请求包含当前设备上的应用版本信息。 2. **获取XML**:服务器根据请求返回对应的XML更新信息。 3. **解析XML**:客户端收到XML后,解析...

    Android自动检测版本及自动升级

    在Android应用开发中,自动检测...通过以上步骤,Android应用能够实现自动检测服务器上的版本更新,下载并提示用户安装新版本,从而保持应用的最新状态。这不仅提高了用户体验,也有助于开发者及时推送修复和新特性。

Global site tag (gtag.js) - Google Analytics