关于安卓自动升级的一些思路
来源:互联网 发布:黑客帝国文字矩阵 编辑:程序博客网 时间:2024/05/19 23:55
通过接口,返回新版本的版本号以及新版本下载地址,通过Downloadmangeri下载更新。
1.UpdateActivity(实现下载功能的主代码)
package com.tolly.parking;import android.app.DownloadManager;import android.app.ProgressDialog;import android.content.*;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.support.annotation.Nullable;import android.support.v4.content.LocalBroadcastManager;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.util.Log;import android.widget.Toast;import com.tolly.parking.entity.UpdateInfo;import com.tolly.parking.enumeration.FunctionListEnum;import com.tolly.parking.serviceImpl.UpdateServicelmpl.UpdateServicelmpl;import com.tolly.parking.util.DeviceInfoUtil;import com.tolly.parking.vo.UpdateVO;import org.codehaus.jackson.map.ObjectMapper;import java.io.File;import java.io.IOException;import java.util.concurrent.Callable;import static com.tolly.parking.enumeration.CommandEnum.DOWN_ERROR;import static com.tolly.parking.enumeration.CommandEnum.GET_UNDATAINFO_ERROR;import static com.tolly.parking.enumeration.CommandEnum.UPDATA_CLIENT;import static com.tolly.parking.util.JsonTransitionObjectUtil.objectMapper;/** * Created by zyy on 2017/7/19. */public class UpdateActivity extends AppCompatActivity { private String versionName; private int versionCode; MyReceiver receiver = new MyReceiver(); public static final String BROADCAST_ACTION = "com.example.android.threadsample.BROADCAST"; public static final String EXTENDED_DATA_STATUS = "com.example.android.threadsample.STATUS"; private LocalBroadcastManager mLocalBroadcastManager; //服务器中APK下载地址 private String updateurl; private Context context; //自动更新的实现类 private UpdateServicelmpl UpdateService; public final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle bundle = msg.getData(); switch (msg.arg1) { case UPDATA_CLIENT: //处理服务器返回的结果 handleUpdateClientResult(bundle); break;// case GET_UNDATAINFO_ERROR:// //服务器超时// Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", Toast.LENGTH_SHORT).show();// LoginMain();// break;// case DOWN_ERROR:// //下载apk失败// Toast.makeText(getApplicationContext(), "下载新版本失败", Toast.LENGTH_SHORT).show();// LoginMain();// break; } } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获得APP版本名称和版本号 versionName = DeviceInfoUtil.getAppVersionName(getApplicationContext()); versionCode = DeviceInfoUtil.getAppVersionCode(getApplicationContext());// Log.i("测试:", "versionName:"+versionName+",versionCode:"+versionCode); //更新接口 UpdateService = new UpdateServicelmpl(handler); UpdateVO updatevo = new UpdateVO(); try { UpdateService.UpdateClient(updatevo); } catch (Exception e) { e.printStackTrace(); } regist(); } /** * 处理服务器返回的APP版本号 * @param bundle */ private void handleUpdateClientResult(Bundle bundle){ String json = bundle.getString(FunctionListEnum.UpdateClient.toString()); ObjectMapper objectMapper = new ObjectMapper(); if (null != json && !"".equals(json)){ try { UpdateVO updatevo = objectMapper.readValue(json,UpdateVO.class); if (null != updatevo){ int serverversioncode = updatevo.getServerVersionCode(); updateurl = updatevo.getUrl();// if ( !"".equals(serverversioncode)){ if (versionCode
2.更新接口
package com.tolly.parking.service.updateService;import com.tolly.parking.vo.UpdateVO;/** * 更新接口 * Created by zyy on 2017/7/24. */public interface UpdateService { /** *更新接口 * @param updatevo * @throws Exception */ void UpdateClient(UpdateVO updatevo) throws Exception;}
3.接口的实现
代码中的url是接口的地址
package com.tolly.parking.serviceImpl.UpdateServicelmpl;import android.os.Handler;import com.tolly.parking.Common.Constant;import com.tolly.parking.entity.UserUser;import com.tolly.parking.enumeration.CommandEnum;import com.tolly.parking.enumeration.ContentTypeEnum;import com.tolly.parking.enumeration.FunctionListEnum;import com.tolly.parking.service.updateService.UpdateService;import com.tolly.parking.util.FunctionUtil;import com.tolly.parking.util.InstanceServiceUtil;import com.tolly.parking.util.ServerDataExchangeUtil;import com.tolly.parking.vo.UpdateVO;import java.util.HashMap;import java.util.Map;/** * 更新接口的实现 * Created by zyy on 2017/7/24. */public class UpdateServicelmpl implements UpdateService{ private Handler handler; private ServerDataExchangeUtil serverDataExchangeUtil; public UpdateServicelmpl(Handler handler) { this.handler = handler; init(); } /** * 初始化 */ private void init() { try { serverDataExchangeUtil = new ServerDataExchangeUtil(); } catch (Exception e) { e.printStackTrace(); } } @Override public void UpdateClient(UpdateVO updatevo) throws Exception { String url= Constant.UPDATEURL; if(null != url && !"".equals(url)) { String mac = Constant.MAC; url = "http://" + url + FunctionUtil.getFunctionList(FunctionListEnum.UpdateClient.toString()); MapmapPara = new HashMap<>(); mapPara.put("mac", mac); //创个userUser, 使之有token InstanceServiceUtil.writeMap(UserUser.class.toString(), new UserUser()); serverDataExchangeUtil.handler = handler; serverDataExchangeUtil.PostValue(CommandEnum.UPDATA_CLIENT, FunctionListEnum.UpdateClient.toString(), url, mapPara,ContentTypeEnum.Text.getContentType()); } }}
4.服务器接口
接口返回的是新版本的版本号以及版本下载地址
package com.example.demo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.*;import java.util.Map;/** * Created by JJH on 2017/7/27. */@RestController@RequestMapping("/bang")public class DemoController { private Logger logger = LoggerFactory.getLogger(this.getClass()); @PostMapping("/getVersion") public UpdateVO getVersionByMac(String mac){ logger.info("请求查询版本号接收的到参数为:" + mac); // ================== 根据mac查询version的逻辑程序(一般入service服务类,也可以直接写)===== UpdateVO updateVO = new UpdateVO(); APKcode apkcode = new APKcode(); Mapmap = apkcode.readAPK(); Object obj = map.get("versionCode"); int serverVersionCode = 0; if(null != obj) { serverVersionCode = Integer.parseInt(obj.toString()); } updateVO.setServerVersionCode(serverVersionCode); updateVO.setUrl("F:\\app-debug.apk"); return updateVO; // ====================end=================== }}class UpdateVO{ private int serverVersionCode; private String url; public int getServerVersionCode() { return serverVersionCode; } public void setServerVersionCode(int serverVersionCode) { this.serverVersionCode = serverVersionCode; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }}
5.实体
package com.tolly.parking.vo;/** * 更新时服务器版本号VO * Created by zyy on 2017/7/25. */public class UpdateVO { //服务器中APP版本号 private int serverVersionCode; private String url; public int getServerVersionCode() { return serverVersionCode; } public void setServerVersionCode(int serverVersionCode) { this.serverVersionCode = serverVersionCode; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; }}
6.从服务器获取APK版本号
这个代码是网上查找的,自己修改运行。需要下载架包
AXmlResourceParser.jar
package com.example.demo;import org.apkinfo.api.util.AXmlResourceParser;import org.apkinfo.api.util.TypedValue;import org.apkinfo.api.util.XmlPullParser;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;/** * Created by zyy on 2017/8/1. */public class APKcode {// public static void main(String[] args) {// Mapmap = readAPK();// System.out.println("package:"+map.get("package")+",versionCode:"+map.get("versionCode"));// } /** * 读取APK * @return */ public static Map readAPK() { String apkUrl= "F:\\app-debug.apk"; ZipFile zipFile; Map map = new HashMap (); try { zipFile = new ZipFile(apkUrl); Enumeration> enumeration = zipFile.entries(); ZipEntry zipEntry = null; while (enumeration.hasMoreElements()) { zipEntry = (ZipEntry) enumeration.nextElement(); if (zipEntry.isDirectory()) { } else { if ("androidmanifest.xml".equals(zipEntry.getName().toLowerCase())) { AXmlResourceParser parser = new AXmlResourceParser(); parser.open(zipFile.getInputStream(zipEntry)); while (true) { int type = parser.next(); if (type == XmlPullParser.END_DOCUMENT) { break; } String name = parser.getName(); if (null != name && name.toLowerCase().equals("manifest")) { for (int i = 0; i != parser.getAttributeCount(); i++) { if ("package".equals(parser.getAttributeName(i))) { String packageName = getAttributeValue(parser, i); if (null == packageName) { packageName = ""; } map.put("package", packageName); } else if ("versionCode".equals(parser.getAttributeName(i))) { String versionCode = getAttributeValue(parser, i); if (null == versionCode) { versionCode = ""; } map.put("versionCode", versionCode); } } break; } } } } } zipFile.close(); } catch (Exception e) { map.put("code", "fail"); map.put("error", "读取apk失败"); } return map; } private static String getAttributeValue(AXmlResourceParser parser, int index) { int type = parser.getAttributeValueType(index); int data = parser.getAttributeValueData(index); if (type == TypedValue.TYPE_STRING) { return parser.getAttributeValue(index); } if (type == TypedValue.TYPE_ATTRIBUTE) { return String.format("?%s%08X", getPackage(data), data); } if (type == TypedValue.TYPE_REFERENCE) { return String.format("@%s%08X", getPackage(data), data); } if (type == TypedValue.TYPE_FLOAT) { return String.valueOf(Float.intBitsToFloat(data)); } if (type == TypedValue.TYPE_INT_HEX) { return String.format("0x%08X", data); } if (type == TypedValue.TYPE_INT_BOOLEAN) { return data != 0 ? "true" : "false"; } if (type == TypedValue.TYPE_DIMENSION) { return Float.toString(complexToFloat(data)) + DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; } if (type == TypedValue.TYPE_FRACTION) { return Float.toString(complexToFloat(data)) + FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; } if (type >= TypedValue.TYPE_FIRST_COLOR_INT && type <= TypedValue.TYPE_LAST_COLOR_INT) { return String.format("#%08X", data); } if (type >= TypedValue.TYPE_FIRST_INT && type <= TypedValue.TYPE_LAST_INT) { return String.valueOf(data); } return String.format("<0x%X, type 0x%02X>", data, type); } private static String getPackage(int id) { if (id >>> 24 == 1) { return "android:"; } return ""; } public static float complexToFloat(int complex) { return (float) (complex & 0xFFFFFF00) * RADIX_MULTS[(complex >> 4) & 3]; } private static final float RADIX_MULTS[] = { 0.00390625F, 3.051758E-005F, 1.192093E-007F, 4.656613E-010F }; private static final String DIMENSION_UNITS[] = { "px", "dip", "sp", "pt", "in", "mm", "", "" }; private static final String FRACTION_UNITS[] = { "%", "%p", "", "", "", "", "", "" };}
阅读全文
2 0
- 关于安卓自动升级的一些思路
- 安卓滑动冲突的理解和一些解决思路
- 软件自动升级程序的设计思路
- wm 自动升级程序的思路
- DELPHI 自动升级思路
- 安卓 关于list数据操作的设计思路
- 关于安卓手机的一些常用命令
- 关于安卓入门的一些提示
- 关于安卓蓝牙的一些研究
- 关于安卓模拟器的一些说明
- 一些关于安卓输入法的博客
- 关于安卓apk签名,OTA升级
- 安卓6.0后的一些以前方法的解决思路
- 关于小鸡管理系统的一些思路
- 关于线程池的一些思路
- 关于系统移植uboot的一些思路
- 关于系统移植uboot的一些思路
- 关于测试的一些思路收集
- 广搜+优先队列 HDU-2822 D
- 字符数组的输入与输出
- 根据广义表构建二叉树
- 设计模式7-原型模式
- list排序(1.根据对象的字段排序 2.根据map集合的key值排序)
- 关于安卓自动升级的一些思路
- 为什么以太网的最小数据帧长度为64字节?
- java实现LDAP 部门和用户的增删改查 实现过程
- 编程题:包含min函数的栈
- hdu-暑假集训-Time To Get Up
- H5学习之 响应式布局
- c++ 类的定义与声明
- 简单模拟——挖掘机
- android端访问本地tomcat