版本更新

1.导包 :Xutils   Gson
  加权限 : 网络、读写权限  "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
2.定义一个类 继承 Application,然后初始化x.Ext.init( this );
   x.Ext.setDebug(BuildConfig. DEBUG );然后在MainActivity中,
   x. view ().inject( this );
3.定义一个类,写一个用来获取当前应用的版本号的方法,包管理 PackageManager
包名字getPackageName            包信息 PackageInfo 
应用的版本  codepackageInfo.versionCode
4.然后写Bean类,数据
5.解析数据Gson,得到 messageBean对象,判断messageBean成功后,是否有更新。如果有更新,在判断是否是强制更新还是选择更新,如果没更新,吐司就行。
6.如果是强制更新,就弹出一个框 AlertDialog ,设置标题为 版本更新, 设置消息为 升级到最新版本 设置为不可取消; 如果是选择更新,也弹出一个框 AlertDialog, 设置消息为 是否要升级到最新版本
   这两个要升级的时候,都需要下载的目录,定义一个 版本更新的方法,设置下载保存路径 params.setSaveFilePath(),用xutils的文件下载,实现 ProgressCallback 接口,重写7个方法,在 onLoading 中,进行设置进度条。成功了就隐藏进度条,并且安装apk。
代码:
BaseApplication:
import android.app.Application;
import org.xutils.x;

public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(BuildConfig.DEBUG);
    }
}
VersionUtils:
package com.bawei.liujie.versonupdate;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
public class VersionUtils {
    /**
     * 获取当前应用的versionCode
     */
    public static int getVersionCode(Context context) {
        int versionCode = 0;
        try {
            // 包管理
            PackageManager packageManager = context.getPackageManager();
            // 包名字
            String packageName = context.getPackageName();
            // 包信息
            PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
            // 应用的版本code
            versionCode = packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }
}
Message:
public class Message<T> {
    private boolean success;
    private String message;
    private T result;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getResult() {
        return result;
    }

    public void setResult(T result) {
        this.result = result;
    }
}
Version:
import com.google.gson.annotations.SerializedName;

public class Version {
    @SerializedName("has_new_version")
    private boolean hasNewVersion;
    @SerializedName("must_update")
    private boolean mustUpdate;
    private String url;

    public boolean isHasNewVersion() {
        return hasNewVersion;
    }

    public void setHasNewVersion(boolean hasNewVersion) {
        this.hasNewVersion = hasNewVersion;
    }

    public boolean isMustUpdate() {
        return mustUpdate;
    }

    public void setMustUpdate(boolean mustUpdate) {
        this.mustUpdate = mustUpdate;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}
mainactivity中:
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.x;
import java.io.File;
import java.lang.reflect.Type;

@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private String url = "http://172.18.47.28/checkversion.php";
    // 文件保存地址
    private String targetPath = "";
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);

        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File file = Environment.getExternalStorageDirectory();
            targetPath = file.getAbsolutePath() + File.separator;
        }
        progressDialog = new ProgressDialog(this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    }

    @Event(R.id.btn_check_version)
    private void btnClick(View v) {
        checkVerson();
    }

    /**
     * 检查版本号
     */
    private void checkVerson() {
        int versionCode = VersionUtils.getVersionCode(this);
        RequestParams params = new RequestParams(url);
        params.addQueryStringParameter("version", String.valueOf(versionCode));
        x.http().get(params, new Callback.CommonCallback<String>() {

            @Override
            public void onSuccess(String result) {
                Log.i("---------", "onSuccess: " + result);
                Gson gson = new Gson();
                Type type = new TypeToken<Message<Version>>() {
                }.getType();
                Message<Version> messageBean = gson.fromJson(result, type);
                if (messageBean.isSuccess()) {
                    final Version version = messageBean.getResult();
                    // 有更新
                    if (version.isHasNewVersion()) {
                        // 强制更新
                        if (version.isMustUpdate()) {
                            new AlertDialog.Builder(MainActivity.this)
                                    .setTitle("版本更新")
                                    .setMessage("升级到最新版本")
                                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            updateVersion(version.getUrl());
                                            dialog.dismiss();
                                        }
                                    })
                                    // 不可取消
                                    .setCancelable(false)
                                    .create().show();
                        }else{
                            // 选择更新
                            new AlertDialog.Builder(MainActivity.this)
                                    .setTitle("版本更新")
                                    .setMessage("是否要升级到最新版本")
                                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            updateVersion(version.getUrl());
                                            dialog.dismiss();
                                        }
                                    })
                                    .setNegativeButton("下次再说", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            dialog.dismiss();
                                        }
                                    })
                                    .create().show();
                        }
                        } else {
                            // 无可用更新
                            Toast.makeText(MainActivity.this, "当前已经是最新版本", Toast.LENGTH_SHORT).show();
                        }
                    }
                }

                @Override
                public void onError (Throwable ex,boolean isOnCallback){
                    Log.i("------------", "onError: " + ex.getMessage());
                }

                @Override
                public void onCancelled (CancelledException cex){
                }

                @Override
                public void onFinished () {
                }
            });
        }

    /**
     * 版本更新
     */
    private void updateVersion(String url) {
        targetPath = targetPath + System.currentTimeMillis() + ".apk";
        RequestParams params = new RequestParams(url);
        // 设置下载保存路径
        params.setSaveFilePath(targetPath);
        // xutils的文件下载
        x.http().get(params, new Callback.ProgressCallback<File>() {
            @Override
            public void onSuccess(File result) {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                installApk(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(CancelledException cex) {
            }

            @Override
            public void onFinished() {
            }

            @Override
            public void onWaiting() {
            }

            @Override
            public void onStarted() {
            }
            @Override
            public void onLoading(long total, long current, boolean isDownloading) {
                if (isDownloading) {
                    progressDialog.setMessage("正在下载...");
                    progressDialog.show();
                    progressDialog.setMax((int) total);
                    progressDialog.setProgress((int) current);
                }
            }
        });
    }

    /**
     * 安装apk
     */
    private void installApk(File file) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory("android.intent.category.DEFAULT");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        startActivity(intent);
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值