【Android】-- 如何对APP版本控制/更新?
目录
一、 前提准备
1、获取服务器
2、使用工具操作云服务器
二、Json格式网页
三、创建file_paths.xml及修改AndroidManifest.xml
四、在java代码加入更新检测代码
效果如图:
可以强制更新和非强制更新,和浏览器下载安装包。
一、 前提准备
1、获取服务器
首先去获取云服务器,如:阿里云服务器(学生可免费领取六个月)、腾讯云服务器、华为云服务器等。具体操作参考:从零开始用阿里云服务器搭建网页_阿里云怎么装修网页打开_zstar-_的博客-CSDN博客
云服务器用于存放json格式网页和安装包,json可以对app进行版本控制更新、显示版本、显示更新内容、提供安装包下载位置等信息。
2、使用工具操作云服务器
可以使用指令控制,也可以使用工具控制服务器,选用putty软件进行远程控制,winSCP软件进行文件传输。下载链接
以下是winSCP界面的服务器文件:可按下面文件找到存放安装包和网页的文件夹。
如下就是对APP进行版本更新的网页和安装包存放的文件夹:
二、Json格式网页
以下是html网页代码:
UFCFans let btn = document.querySelector('#json'); let data = {"hasUpdate": true,"NoIgnorable": true, "versionCode": 2, "versionName": "2.0", "updateLog": "\n1、新增本地缓存。\n2、解决部分BUG。\n3、优化使用体验。", "apkUrl": "http://8.130.127.118:8080/ufcfans.apk", "webUrl": "http://8.130.127.118:8080/ufcfans.apk", "apkSize": "29.5MB"}; btn.textContent = JSON.stringify(data, null, 2);
下面是相关变量说明:
{ hasUpdate: true, //是否有更新 默认true NoIgnorable: true, //不 可忽略更新 强制:true 非强制:false versionCode: 51, //服务端的版本号 versionName: "2.4.1", //服务端的版本名 updateLog: "\n1、更改保存图片的存储路径。\n2、更改软件更新的提示模式。\n3、调整非强制更新控制方式。\n4、新增存储权限的申请授权位置。", //更新提示内容 apkUrl: "https://www.yuming.com/assets/a某o130.apk",//新版本APK直链下载地址 webUrl: "https://yirj.gitee.io/update111",//浏览器更新链接,随意放(直链、蓝奏、官网均可) apkSize: "29.5MB" //新版本的大小 随意写就好 }
三、创建file_paths.xml及修改AndroidManifest.xml
创建file_paths.xml
修改AndroidManifest.xml
.........
四、在java代码加入更新检测代码
在软件的检测更新界面的Oncreate方法下,加入检测更新的代码。
NoIgnorable变量为true则强制更新,无取消按钮,为false有取消按钮;
versionName, updateLog, apkSize, apkUrl, webUrl和upl变量为你的网页网址,如:UFCFanshttp://8.130.127.118:8080
public static JSONObject jSONObject = null; private static boolean hasUpdate = true; private static boolean NoIgnorable; //是否有更新。 不可忽略的更新 private static int versionCode = 0; private static String versionName, updateLog, apkSize, apkUrl, webUrl; private static String[] upl;
/** * 获取当前使用的软件包的版本号 */ public int getVersionCode() { try { //获取packagemanager的实例 PackageManager packageManager = getPackageManager(); //getPackageName()是你当前类的包名,0代表是获取版本信息 PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); Log.e("TAG", "版本号" + packInfo.versionCode); //更新软件用的是版本号 return packInfo.versionCode; } catch (Exception e) { e.printStackTrace(); } return 1; } /** * 提示版本更新的对话框 */ public void showDialogUpdate() { //hasUpdate为true且程序版本号= 24) { Uri apkUri = FileProvider.getUriForFile(this, "com.example.ufcfans.fileprovider", file); //这里要写你程序的包名,已实验不可使用${applicationId} intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); } else { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); } this.startActivity(intent); } /** * 从服务器获取apk文件的代码 * 传入网址uri,进度条对象即可获得一个File文件 * (要在子线程中执行哦) */ public static File getFileFromServer(String uri, ProgressDialog pd) throws Exception { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { URL url = new URL(uri); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); //获取到文件的大小 pd.setMax(conn.getContentLength()); //字节的方式显示下载进度 InputStream is = conn.getInputStream(); //获取直链链接最后一个“/”后文字作为文件名,下载存储到手机 File file = new File(Environment.getExternalStorageDirectory(), apkUrl.substring(apkUrl.lastIndexOf("/", apkUrl.lastIndexOf("")) + 1)); FileOutputStream fos = new FileOutputStream(file); BufferedInputStream bis = new BufferedInputStream(is); byte[] buffer = new byte[1024]; int len; int total = 0; while ((len = bis.read(buffer)) != -1) { fos.write(buffer, 0, len); total += len; //获取当前下载量 pd.setProgress(total);//字节方式显示下载量 } fos.close(); bis.close(); is.close(); return file; } else { return null; } } /** * 权限的验证及处理,相关方法 */ private void getReadPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 10001); } else {//没有则请求获取权限,示例权限是:存储权限,需要其他权限请更改或者替换 ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 10001); } } else {//如果已经获取到了权限则直接进行下一步操作 Log.e(TAG, "全部权限已经授权成功"); } } } /** * 一个或多个权限请求结果回调 * 循环回调获取权限,除非勾选禁止后不再询问,之后提示用户引导用户去设置 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 10001: for (int i = 0; i至此,已完成对应用的版本控制更新,通过
更改html文件的versionVode控制更新,如:默认为1,改为2时,用户APP会弹出更新框。