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
如果出现更新成功后,界面和你的最新的版本的程序不一样,试下把你下载的安装包删了试下。
开心一刻

不怪我,怪凳子系列,老师们···
