apk版本的的比对、下载、安装需求分析

0.通过xutils3进行网络数据请求、文件下载

1.请求服务器获取服务器存储的版本信息

2.通过比对手机端的版本和服务器的版本

3如果要更新需要符合以下判断条件

   1)sdcard是否存在

    2)sdcard剩余存储量与apk文件大小的比对

    3)是否在wifi环境下

4.下载完成后自动安装


详情请看我上传到csdn的文件(http://download.csdn.net/detail/wg243964183/9720866)。


-----核心代码---

1.需要xutils3.jar自己去网上下载

2.需要的权限


                                     

2.布局文件

activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>        

3.清单文件AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>                                                                                                                                        


4.xutils的初始化
MyApplication.java
package com.smart.mobileasfe.application;import android.app.Application;import com.smart.mobileasfe.activity.BuildConfig;import org.xutils.x;/** * Created by 光 on 2016/12/25. */public class MyApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        //设置xutils进行ioc操作        x.Ext.init(this);        x.Ext.setDebug( BuildConfig.DEBUG);    }}

4.工具类
AndroidUtils.java
package com.smart.mobileasfe.utils;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManager;import android.net.Network;import android.net.NetworkInfo;import android.net.Uri;import android.os.Environment;import android.util.Log;import java.io.File;/** * Created by 光 on 2016/12/25. */public class AndroidUtils {    /**     * 判断SDcard是否可用     * @return     */    public static boolean sdcardExists() {       return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());    }    /**     * 获取SDcard的总存储量,返回-1则不存在     * @return     */    public static long getTotalSpace() {        if(sdcardExists()) {            File file = Environment.getExternalStorageDirectory();            return file.getTotalSpace();//文件的总大小(此方法应用于8以上,需要在此方法打上NewApi的注解)        } else {            return -1;        }    }    /**     * 获取SDcard的剩余存储量,返回-1则不存在     * @return     */    public static long getUsableSpace() {        if(sdcardExists()) {            File file = Environment.getExternalStorageDirectory();            return file.getUsableSpace();//文件的总大小(此方法应用于8以上,需要在此方法打上NewApi的注解)        } else {            return -1;        }    }    /**     * 安装apk包     * @param context Context 上下文对象     * @param apkFile File apk文件对象     */    public static void installApk(Context context,File apkFile) {        Log.e("OpenFile", apkFile.getName());        Intent intent = new Intent();        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        intent.setAction(android.content.Intent.ACTION_VIEW);        intent.setDataAndType(Uri.fromFile(apkFile),                "application/vnd.android.package-archive");        context.startActivity(intent);    }    /**     * 安装apk包     * @param context Context 上下文对象     * @param apkFile String 文件路径     */    public static void installApk(Context context,String apkFile) {        installApk(context,new File(apkFile));    }    /**     * 判断你是否在为wifi环境     * @param context     * @return     */    public static boolean isWifi(Context context) {        ConnectivityManager connectivityManager = (ConnectivityManager) context                .getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();        if (activeNetInfo != null                && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {            return true;        }        return false;    }}


5.activity类 核心

SplashActivity.java
   
   
package com.smart.mobileasfe.activity;import android.app.ProgressDialog;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.os.Environment;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;import android.widget.Toast;import com.smart.mobileasfe.utils.AndroidUtils;import org.json.JSONObject;import org.xutils.common.Callback;import org.xutils.http.RequestParams;import org.xutils.view.annotation.ContentView;import org.xutils.view.annotation.ViewInject;import org.xutils.x;import java.io.File;@ContentView(R.layout.activity_splash)//通过注解引入布局文件public class SplashActivity extends AppCompatActivity {    @ViewInject(R.id.tv_version)//通过注解,注入布局文件中的属性    private TextView tv_version;    private ProgressDialog progressDialog;    private long loadLength = 0;//下载文件的长度    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        x.view().inject(this);//通过xUtils注解初始化容器的组件        initData();    }    /**     * 初始化数据     */    private void initData() {        tv_version.setText(getVersionName());        checkVersion();    }    /**     * 检测版本是否更新     */    private void checkVersion() {        //设置网络请求        RequestParams params = new RequestParams("http://192.168.1.6:8080/version.json");        /** --服务器端的json文件配置         {         "downloadUrl": "http://192.168.1.6:8080/mobilesafe-debug.apk",         "versionCode": 2,         "versionDes": "2.0版本,新增。。。功能",         "versionName": "2.0"         }         */        //以post的方式进行网络请求        x.http().post(params,new Callback.CommonCallback() {            @Override            public void onSuccess(String o) {               try {                    //处理服务器回传回来的数据                   JSONObject json = new JSONObject(o);                   int versionCode = json.getInt("versionCode");                   String versionName = json.getString("versionName");                   String versionDes = json.getString("versionDes");                   final String url = json.getString("downloadUrl");                   int currentCode = getVersionCode();                   //当前版本与服务器中的版本作比较                   if(versionCode > currentCode) {                       //是否存在SDcard                       if(AndroidUtils.sdcardExists()) {                           //获取sdcard系统的目录                           final String BASE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator;                           //获取当前网络状态,是否在wifi环境下                           boolean isWifi = AndroidUtils.isWifi(SplashActivity.this);                           if(isWifi){                               downloadApk(url,BASE_PATH);                           }else {                               //不再wifi环境下提醒用户是否更新                               AlertDialog.Builder builder = new AlertDialog.Builder(SplashActivity.this);                               builder.setMessage("不再WIFI环境下,确认下载吗?");                               builder.setTitle("下载新版本");                               builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {                                   @Override                                   public void onClick(DialogInterface dialog, int which) {                                       dialog.dismiss();                                       downloadApk(url,BASE_PATH);                                   }                               });                               builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {                                   @Override                                   public void onClick(DialogInterface dialog, int which) {                                       dialog.dismiss();                                       startActivity(new Intent(getApplicationContext(),SplashOneActivity.class));                                   }                               });                               builder.create().show();                           }                       }                   } else {                       //跳转到应用界面                       startActivity(new Intent(getApplicationContext(),SplashOneActivity.class));                   }               } catch (Exception e) {                   showMessage("服务器忙请稍后。。。");               }            }            @Override            public void onError(Throwable throwable, boolean b) {                showMessage("服务器忙请稍后。。。");            }            @Override            public void onCancelled(CancelledException e) {            }            @Override            public void onFinished() {            }        });    }    private void showMessage(String content) {        Toast.makeText(getApplicationContext(),content,Toast.LENGTH_LONG).show();    }    /**     * 获取当前版本名称     * @return     */    private String getVersionName() {        String versionName = "";        PackageManager pm = getPackageManager();        try {            PackageInfo pi = pm.getPackageInfo(getPackageName(),0);            versionName = pi.versionName;        } catch (Exception e) {        }        return versionName;    }    /**     * 获取当前版本号     * @return     */    private int getVersionCode() {        int versioncode = 0;        PackageManager pm = getPackageManager();        try {            PackageInfo pi = pm.getPackageInfo(getPackageName(),0);            versioncode = pi.versionCode;        } catch (Exception e) {        }        return versioncode;    }    /**     *     * @param url apk的网络路径,apk下载完成后存储的路径     * @param path     */    private void downloadApk(final String url, String path) {        progressDialog = new ProgressDialog(this);        RequestParams requestParams = new RequestParams(url);        requestParams.setSaveFilePath(path);        x.http().get(requestParams, new Callback.ProgressCallback() {            @Override            public void onWaiting() {            }            @Override            public void onStarted() {            }            /**             * 下载中             * @param total 文件的总长度             * @param current 文件当前的长度             * @param isDownloading 是否在下载             */            @Override            public void onLoading(final long total, final long current, boolean isDownloading) {                if(AndroidUtils.getTotalSpace() < total) {                    showMessage("SD卡存储空间不足,请进行清理");                    return ;                }                loadLength+=current;                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);                progressDialog.setMessage("亲,努力下载中。。。");                progressDialog.show();                progressDialog.setMax((int) total);                progressDialog.setProgress((int) loadLength);                Log.e("亲,努力下载中。。。",((double)loadLength)/((double)total) + "%");            }            /**             * 下载完成             * @param result File此文件就是apk的全部文件路径对象             */            @Override            public void onSuccess(File result) {                loadLength = 0;                Toast.makeText(SplashActivity.this, "下载成功", Toast.LENGTH_SHORT).show();                AndroidUtils.installApk(SplashActivity.this,result);                progressDialog.dismiss();            }            @Override            public void onError(Throwable ex, boolean isOnCallback) {                ex.printStackTrace();                Toast.makeText(SplashActivity.this, "下载失败,请检查网络和SD卡", Toast.LENGTH_SHORT).show();                progressDialog.dismiss();            }            @Override            public void onCancelled(CancelledException cex) {            }            @Override            public void onFinished() {            }        });    }}



更多相关文章

  1. 通过OTA的方式在局域网分发iOS应用
  2. android之MediaPlayer播放音频或者视频文件
  3. Android(安卓)APK文件在电脑(PC虚拟机)上面运行方法
  4. Android(安卓)打包及引用 aar 文件的方法
  5. android下用itext修改pdf模板文件
  6. Android开发之 混淆加固和反编译
  7. 如何解决Android客户端工程编码转换问题
  8. 安卓root漏洞分析——CVE-2009-1185
  9. Android(安卓)轻松实现后台搭建+APP版本更新

随机推荐

  1. android style(样式)和theme(主题)设置
  2. Android异步处理一:使用Thread+Handler实
  3. Android开发实践:Android交叉编译工具链的
  4. Android中多线程同步问题
  5. 移动端app开发-02-iPhone/iPad/Android(
  6. Android事件分发机制详解:史上最全面、最
  7. Android:你要的WebView与 JS 交互方式 都
  8. 关于Android的一些设计
  9. Android内核开发:理解和掌握repo工具
  10. 【Android(安卓)Training - 04】保存数据