Android APP自动更新

Android 自动更新

刺客伍六七
1 . 先导入包

库的链接 clickme

implementation 'com.allenliu.versionchecklib:library:2.0.8'

     测试是可以用的,谁知道引入到这个老项目有v4包的冲突,真是日了狗了,我又解决不了,只好再找了,用的这个:

  implementation "com.github.yjfnypeu:UpdatePlugin:3.1.0"

  主要代码
private void checkUpApp() {
        //检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //用户已经拒绝过一次,再次弹出权限申请对话框需要给用户一个解释
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
                    .WRITE_EXTERNAL_STORAGE)) {
                Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();
            }
            //申请权限
//            requestPermissions( new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 125);

        } else {

//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//                //先获取是否有安装未知来源应用的权限
//                boolean   haveInstallPermission = getPackageManager().canRequestPackageInstalls();
//                if (! haveInstallPermission){
//                     Toast.makeText(this, "请开通安装未知来源的权限,否则无法APP可能无法正常使用!", Toast.LENGTH_SHORT).show();
//                }
//
//            }


//                            Log.i("test-1","test----222224444");
                    UpdateBuilder builder = UpdateBuilder.create(updateConfig());
                    builder.setUpdateStrategy(new UpdateStrategy() {
                        @Override
                      //控制是否有更新显示提示,而不是什么都没有,在后台更新
                        public boolean isShowUpdateDialog(Update update) {
                            return true;
                        }
                        //控制是否显示进度条
                        @Override
                        public boolean isShowDownloadDialog() {
                            return true;
                        }

                        @Override
                        public boolean isAutoInstall() {
                            return false;
                        }
                    }).check();

//                }
//            }

        }



    }

    private UpdateConfig updateConfig(){
      return   UpdateConfig.getConfig()
                .setUrl("自己的服务器请求接口")
                .setUpdateParser(new UpdateParser() {
                    @Override
                    public Update parse(String response) throws Exception {
                        /* 此处根据上面url或者checkEntity设置的检查更新接口的返回数据response解析出
                         * 一个update对象返回即可。更新启动时框架内部即可根据update对象的数据进行处理
                         */
                        JSONObject result = new JSONObject(response);

                        Integer code = result.getInt("code");
//                        Log.i("test-1","test----3333code:"+code);
                        if (code == 1){
//                            Log.i("test-1","test----55555:"+code);
                            JSONObject object = result.getJSONObject("data");

                            Integer version = object.optInt("version");

                            Integer currentVersion =  VersionUtil.getVersionCode(MainTabActivity.this);

                            Update update = new Update();
                            // 此apk包的下载地址
                            update.setUpdateUrl(object.optString("url"));

                            // 此apk包的版本号
                            update.setVersionCode(object.optInt("version"));
                            // 此apk包的版本名称
                            update.setVersionName(object.optString("name"));
                            // 此apk包的更新内容
                            update.setUpdateContent(object.optString("des"));
                            // 此apk包是否为强制更新 根据后台返回 设置1代表强制更新
                            Integer must = object.optInt("must");
                            update.setForced(must == 1 ? true : false);
                            // 是否显示忽略此次版本更新按钮
                            update.setIgnore(object.optBoolean("ignore_able",false));
//                           Log.i("test-1","999999"+version+"currentversion:"+currentVersion);
                            return update;
                        }else {
//                            Log.i("test-1","test----4444:"+code);
                            return null;
                        }

                    }
                });
    }
2 · 在 "AndroidManifest.xml" 中添加权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
//下面的权限现在用的更新库可要可不要 vibrate 是震动的,wake_lock是和锁屏有关的
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
3 · 小插曲
    3·1
    由于用的本地的tomacat作为服务器测试, 所以要使用 http://10.0.2.2 ,而不是127.0.0.1,会提示端口被占用,貌似android会默认把这个认为是自己,不懂。
    3·2
    支持http
    在res文件夹下新建一个xml文件
      <?xml version="1.0" encoding="utf-8"?>
      <network-security-config>
         <base-config cleartextTrafficPermitted="true" />
      </network-security-config>
   之后在 "AndroidManifest.xml" 的<application 添加android:networkSecurityConfig="@xml/你的XML文件名">
4 · 代码设置
AllenVersionChecker
               .getInstance()
               .requestVersion()
               .setRequestUrl("http://10.0.2.2/update.json")
               .request(new RequestVersionListener() {
                   @Nullable
                   @Override
                   public UIData onRequestVersionSuccess(String result) {
                       float id = (float)1.0;
                       String name = "";
                       float currentVersion =Float.parseFloat( Tools.getVersion(MainActivity.this));
                       Log.e("current",String.valueOf(currentVersion<=0 ? "0" : currentVersion));
                       Log.e("result:",result);
                       //拿到服务器返回的数据,解析,拿到downloadUrl和一些其他的UI数据
                       try {

                           //新建jsonobject 对象 把json格式的字符串 传进来
                           JSONObject jsonObject =new JSONObject(result);
                           Integer code = jsonObject.getInt("code");
                           //把除了头之外的内容读取出来 存为新的jsonobject 对象
                           JSONObject personjsonObject=jsonObject.getJSONObject("data");
                           //把数据中的id读取出来 赋值 给id
                            id= (float) personjsonObject.getDouble("version");
                           //把数据中的name读取出来 赋值 给name
                           name=personjsonObject.getString("url");

                           Toast.makeText(MainActivity.this,"code"+code+"version"+id,Toast.LENGTH_LONG).show();

                           Log.e("result:","2222"+id+"url"+name);
                       } catch (JSONException e) {
                           e.printStackTrace();
                       }
                       Log.e("result:","11111");
                       if (id > currentVersion){
                           Toast.makeText(MainActivity.this,"new app",Toast.LENGTH_SHORT).show();
                           //如果是最新版本直接return null
                           UIData uiData = UIData
                                   .create()
                                   .setDownloadUrl(name)
                                   .setTitle("亲,app更新了")
                                   .setContent("添加文字");
                           //放一些其他的UI参数,拿到后面自定义界面使用
                           uiData.getVersionBundle().putString("key", "your value");
                           return uiData;
                       }else {
                           Toast.makeText(MainActivity.this,"old app"+id,Toast.LENGTH_SHORT).show();
                           //如果是最新版本直接return null
                           return null;
                       }

                   }

                   @Override
                   public void onRequestVersionFailure(String message) {
                       Log.e("TAG","error"+message);
                       Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show();
                   }
               })
               .excuteMission(this);

   }

工具类

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

public class Tools {

    public static String getVersion(Context context) {
        try {

            PackageManager manager =context.getPackageManager();


            PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
            String version = info.versionName;
            return version;

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

5 · bug
如果出现更新成功后,界面和你的最新的版本的程序不一样,试下把你下载的安装包删了试下。

开心一刻


不怪我,怪凳子系列,老师们···
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。