Android 自动检测更新apk版本

原创 2015年11月19日 22:14:45

Android 自动检测更新apk版本

1)、功能类实现
public class UpdateManager {
    private ProgressBar mProgressBar;//进度条
    private TextView tv1;
    private TextView tv2;
    private Dialog mDownloadDialog;//对话框

    private String mSavePath;//apk保存地址
    private int mProgress;//进度值

    private boolean mIsCancel = false;//是否取消下载标示符

    private static final int DOWNLOADING = 1;//apk下载中
    private static final int DOWNLOAD_FINISH = 2;//apk下载完毕
    private float length;

    private static final String PATH = "http://www.jcpeixun.com/app_client_api/app_version.aspx";//更新地址

    private String mVersion_code;//软件升级标示号
    private String mVersion_name = "开心ing.apk";//apk名
    private String mVersion_desc;//更新详情
    private String mVersion_path;//apk下载地址

    private Context mContext;//上下文

    public UpdateManager(Context context) {
        mContext = context;
    }

    private Handler mGetVersionHandler = new Handler(){
        public void handleMessage(Message msg) {
            JSONObject jsonObject = (JSONObject) msg.obj;
            System.out.println(jsonObject.toString());
            Log.e("----------",jsonObject.toString());
            try {
                mVersion_code = jsonObject.getString("version");
                //mVersion_name = jsonObject.getString("version_name");
                //mVersion_desc = jsonObject.getString("version_desc");
                mVersion_path = jsonObject.getString("downurl");

                Log.e("version ",jsonObject.getString("version"));
                Log.e("downurl ",jsonObject.getString("downurl"));

                if (isUpdate()){
                    //Toast.makeText(mContext, "需要更新", Toast.LENGTH_SHORT).show();
                    // 显示提示更新对话框
                    showNoticeDialog();
                } else{
                    Toast.makeText(mContext, "已是最新版本", Toast.LENGTH_SHORT).show();

                }

            } catch (Exception e){
                e.printStackTrace();
            }
        };
    };

    private Handler mUpdateProgressHandler = new Handler(){
        public void handleMessage(Message msg) {
            switch (msg.what){
                case DOWNLOADING:
                    // 设置进度条
                    mProgressBar.setProgress(mProgress);
                    tv1.setText( mProgress + "/100");
                    float len = length/1024/1024;//将length转换为M单位
                    float b = (float)(Math.round(len*100))/100;//保留两位小数点
                    tv2.setText( b+"M");
                    break;
                case DOWNLOAD_FINISH:
                    // 隐藏当前下载对话框
                    mDownloadDialog.dismiss();
                    // 安装 APK 文件
                    installAPK();
                    break;
                default:
                    break;
            }
        };
    };

    /*
     * 检测软件是否需要更新
     */
    public void checkUpdate() {
        RequestQueue requestQueue = Volley.newRequestQueue(mContext);
        JsonObjectRequest request = new JsonObjectRequest(PATH, null, new Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Message msg = Message.obtain();
                msg.obj = jsonObject;
                mGetVersionHandler.sendMessage(msg);

            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError arg0) {
                System.out.println(arg0.toString());
            }
        });
        requestQueue.add(request);
    }

    /*
     * 与本地版本比较判断是否需要更新
     */
    protected boolean isUpdate() {
        //int serverVersion = Integer.parseInt(mVersion_code);
        double serverVersion = Double.parseDouble(mVersion_code);
        double localVersion = 1;

        try {
            //获得当前apk版本号versionCode
            localVersion = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        if (serverVersion > localVersion)
            return true;
        else
            return false;
    }

    /*
     * 有更新时显示提示对话框
     */
    protected void showNoticeDialog() {
        AlertDialog.Builder builder = new Builder(mContext);
        builder.setTitle("提示");
        String message = "软件有更新,要下载安装吗?\n" + mVersion_desc;
        builder.setMessage(message);

        builder.setPositiveButton("更新", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 隐藏当前对话框
                dialog.dismiss();
                // 显示下载对话框
                showDownloadDialog();
            }
        });

        builder.setNegativeButton("下次再说", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 隐藏当前对话框
                dialog.dismiss();
            }
        });

        builder.create().show();
    }

    /*
     * 显示正在下载对话框
     */
    protected void showDownloadDialog() {
        AlertDialog.Builder builder = new Builder(mContext);
        builder.setTitle("下载中");
        View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_progress, null);
        mProgressBar = (ProgressBar) view.findViewById(R.id.id_progress);
        tv1 = (TextView) view.findViewById(R.id.tv1);
        tv2 = (TextView) view.findViewById(R.id.tv2);
        builder.setView(view);

        // 设置按钮(左)
        builder.setNegativeButton("取消", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 隐藏当前对话框
                dialog.dismiss();
                // 设置下载状态为取消
                mIsCancel = true;
            }
        });
        // 设置按钮(右)
        builder.setNeutralButton("隐藏", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        mDownloadDialog = builder.create();
        mDownloadDialog.show();

        // 下载文件
        downloadAPK();
    }

    /*
     * 开启新线程下载文件
     */
    private void downloadAPK() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{//检查sd是否挂载
                    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                        String sdPath = Environment.getExternalStorageDirectory() + "/";
                        mSavePath = sdPath + "MyDownload";

                        File dir = new File(mSavePath);
                        if (!dir.exists())
                            dir.mkdir();
                        // 下载文件
                        HttpURLConnection conn = (HttpURLConnection) new URL(mVersion_path).openConnection();
                        conn.connect();
                        InputStream is = conn.getInputStream();
                        length = conn.getContentLength();
                        File apkFile = new File(mSavePath, mVersion_name);
                        FileOutputStream fos = new FileOutputStream(apkFile);

                        int count = 0;
                        byte[] buffer = new byte[1024];
                        while (!mIsCancel){
                            int numread = is.read(buffer);
                            count += numread;
                            // 计算进度条的当前位置
                            mProgress = (int) ((count/length) * 100);
                            // 更新进度条
                            mUpdateProgressHandler.sendEmptyMessage(DOWNLOADING);

                            // 下载完成
                            if (numread < 0){
                                mUpdateProgressHandler.sendEmptyMessage(DOWNLOAD_FINISH);
                                break;
                            }
                            fos.write(buffer, 0, numread);
                        }
                        fos.close();
                        is.close();
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /*
     * 下载到本地后执行安装
     */
    protected void installAPK() {
        File apkFile = new File(mSavePath, mVersion_name);
        if (!apkFile.exists())
            return;

        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri uri = Uri.parse("file://" + apkFile.toString());
        intent.setDataAndType(uri, "application/vnd.android.package-archive");
        mContext.startActivity(intent);

    }

}

2)、进度条对话框布局dialog_progress.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/id_progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="14dp"
        android:layout_marginLeft="7dp"
        android:layout_marginRight="7dp"
        android:layout_marginTop="5dp"
        android:progress="14" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="14dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_weight="1"
            android:gravity="left|center"
            android:text="左"
            android:textSize="16dp" />

        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_marginRight="16dp"
            android:layout_weight="1"
            android:gravity="right|center"
            android:text="右"
            android:textSize="16dp" />
    </LinearLayout>
</LinearLayout>

3)、调用实现
new UpdateManager(this).checkUpdate();

4)、原项目视频地址:http://www.jikexueyuan.com/course/1607.html

5)、效果图展示:

自动检测
更新下载进度

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android开发必有功能,更新版本提示,检测是否有新版本更新。下载完成后进行安装。

作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处。给大家介绍个东西,MarkDown真的超级超级好用。哈哈。好了,正题内容如下:先说明,...

android实现gif动态图的使用

在android中显示一个静态图片比如png jpg等等都很方便,但是如果要显示一个gif 动态图片就需要进行一些处理。本文是采用自定义view 然后进行重新onDraw方法来实现首先自定义View【...

Android 47个小知识

Android 47个小知识

android apk版本自动检测升级,安装

网上看了好多自动升级安装的例子.可能是我没配置好.做起来各种的不爽 虽然代码都大同小异 还是自己做的比较满意 先说下主要的实现逻辑:在测试服务器上放一个xml,用来说明服务器的版本,和新apk的下载...

Android客户端apk自动检测更新自动下载自动安装的实现方法

改进了一个可以检测版本更新自动下载自动安装的客户端升级方案。 在下载之前删除之前的历史下载文件,减少垃圾数据。 先给出核心类 public class DownloadService ext...

H5 APP apk/ipa 自动检测版本升级,不通过苹果审核,重启后就是最新版本

先上代码,再说话: var wgtVer = null;//当前版本号以下方法放在页面加载完: mui.plusReady(function() { //下边的方法全部放到这里 }); // 获...

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

  • 2016年08月17日 00:38
  • 37KB
  • 下载

android应用实现自动检测版本升级

在我们APP的开发中,往往都会遇到版本的升级,因为不可能有任何一个应用做的完美无缺,所以版本升级对APP应用来说是不可缺少的一部分.像新浪微博等一些应用软件,三天两头提醒我升级.不过这样也很正常,就像...

android 自动检测版本升级

在我们APP的开发中,往往都会遇到版本的升级,因为不可能有任何一个应用做的完美无缺,所以版本升级对APP应用来说是不可缺少的一部分.像新浪微博等一些应用软件,三天两头提醒我升级.不过这样也很正常,就像...

Android 自动检测版本升级

Android 自动检测版本升级 首先看一个文件manifest文件. Android="http://schemas.android.com/apk/res/andr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 自动检测更新apk版本
举报原因:
原因补充:

(最多只允许输入30个字)