Android(安卓)APP自动更新
16lz
2021-01-26
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" 中添加权限
//下面的权限现在用的更新库可要可不要 vibrate 是震动的,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"?> 之后在 "AndroidManifest.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
如果出现更新成功后,界面和你的最新的版本的程序不一样,试下把你下载的安装包删了试下。
开心一刻
不怪我,怪凳子系列,老师们···
更多相关文章
- Android(安卓)studio 获取手机联系人和号码并输出
- 【Android(安卓)Debug】 Skipping insecure file ...
- android中的Json一
- Android(安卓)SQLite增删改查的语句
- Xamarin.Forms Android的本地数据库SQLite
- 使用ViewPager时,如何对view进行更新
- Android(安卓)应用更新使用Bugly
- android 中自动更新时间机制
- Android(安卓)listview多选模式ChoiceMode