zoukankan      html  css  js  c++  java
  • 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;

    }

    }


    转自:http://www.eoeandroid.com/code/2012/0216/799.html

  • 相关阅读:
    Three.js黑暗中的萤火虫
    Three.js会飞走飞回来的鸟
    Three.js响应和移动物体
    Three.js加载gltf模型
    Three.js创建运动立体几何体示例
    activemq artemis安装运行及其在springboot中的使用
    activemq安装运行及其在springboot中的queue和topic使用
    springboot成神之——mybatis和mybatis-generator
    java成神之——安全和密码
    java成神之——网络编程基本操作
  • 原文地址:https://www.cnblogs.com/shanzei/p/2413893.html
Copyright © 2011-2022 走看看