• java通过解析文件获取apk版本等信息


    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.Namespace;
    import org.jdom.input.SAXBuilder;
    
    import cn.zsmy.constant.Constant;
    
    public class ApkUtil {
        
        private static final Namespace NS = Namespace.getNamespace("http://schemas.android.com/apk/res/android");
        
        @SuppressWarnings({"unchecked", "rawtypes"})
        public static ApkInfo getApkInfo(String apkPath){
            ApkInfo apkInfo = new ApkInfo();
            SAXBuilder builder = new SAXBuilder();
            Document document = null;
            try{
                document = builder.build(getXmlInputStream(apkPath));
            }catch (Exception e) {
                e.printStackTrace();
            }
            Element root = document.getRootElement();//跟节点-->manifest
            apkInfo.setVersionCode(root.getAttributeValue("versionCode",NS));
            apkInfo.setVersionName(root.getAttributeValue("versionName", NS));
            apkInfo.setApkPackage(root.getAttributeValue("package"));
            Element elemUseSdk = root.getChild("uses-sdk");//子节点-->uses-sdk
            apkInfo.setMinSdkVersion(elemUseSdk.getAttributeValue("minSdkVersion", NS));
            List listPermission = root.getChildren("uses-permission");//子节点是个集合
            List permissions = new ArrayList();
            for(Object object : listPermission){
                String permission = ((Element)object).getAttributeValue("name", NS);
                permissions.add(permission);
            }
            apkInfo.setUses_permission(permissions);
            Constant.MY_LOG.debug("
    版本号:"+apkInfo.getVersionCode()+"
    版本名:"+apkInfo.getVersionName()+"
    包名:"+apkInfo.getApkPackage());
            //String str = "
    版本号:"+versionCode+"
    版本名:"+versionName+"
    包名:"+packageName;
            Constant.MY_LOG.debug(root.getAttributes().toString());
            return apkInfo;
    //        String s = root.getAttributes().toString();
    //        String c[] = s.split(",");
    //        String versionCode = null;
    //        String versionName = null;
    //        String packageName = null;
    //        for(String a: c){
    //            if(a.contains("versionCode")){
    //                versionCode = a.substring(a.indexOf("versionCode="")+13, a.lastIndexOf("""));
    //            }
    //            if(a.contains("versionName")){
    //                versionName = a.substring(a.indexOf("versionName="")+13, a.lastIndexOf("""));
    //            }
    //            if(a.contains("package")){
    //                packageName = a.substring(a.indexOf("package="")+9, a.lastIndexOf("""));
    //            }
    //        }        
    //        
    //        Constant.MY_LOG.debug("
    版本号:"+versionCode+"
    版本名:"+versionName+"
    包名:"+packageName);
    //        String str = "
    版本号:"+versionCode+"
    版本名:"+versionName+"
    包名:"+packageName;
    ////        return root.getAttributes().toString();
    //        return str;
    //        return "ss";
        }
    
        private static InputStream getXmlInputStream(String apkPath) {
            InputStream inputStream = null;
            InputStream xmlInputStream = null;
            ZipFile zipFile = null;
            try {
                zipFile = new ZipFile(apkPath);
                ZipEntry zipEntry = new ZipEntry("AndroidManifest.xml");
                inputStream = zipFile.getInputStream(zipEntry);
                AXMLPrinter xmlPrinter = new AXMLPrinter();
                xmlPrinter.startPrinf(inputStream);
                xmlInputStream = new ByteArrayInputStream(xmlPrinter.getBuf().toString().getBytes("UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
                try {
                    inputStream.close();
                    zipFile.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            return xmlInputStream;
        }
    
    }

    调用:

    @ResponseBody
        @RequestMapping(value = "/getApkVersion", method = RequestMethod.POST)
        public String getApkVersion(VersionForm form, MultipartFile apkFile) throws Exception {
            Constant.MY_LOG.debug("获取上传的apk版本");
            File apkTempFile = new File(DictInit.dictMap.get(Constant.Dict.APK_UPLOAD_PATH) + "temp.apk");
            // File apkTempFile = new File("d:\temp.apk");//测试用
            apkFile.transferTo(apkTempFile);
            // 获得apk信息
            ApkInfo apkInfo = new ApkInfo();
            apkInfo = ApkUtil.getApkInfo(apkTempFile.getPath());
            return apkInfo.getVersionName();
        }    
  • 相关阅读:
    UUID工具类
    jax-rs 标准以及 结合 resteasy的使用
    Mina.Net实现的断线重连
    Mina.Net实现的UDP协议消息收发Demo
    MySql 比Replace Into更适合的用法,外加SqlServer的方式。
    MySql【Insert Select Not Exist】判断记录再添加值的方案
    MySql中存储过程中的@变量总是无法执行,提示Parameter '@XXX' must be defined
    Go语言使用Beego的ORM插入Mysql后,时区不一致的解决方案
    Go语言中Path包用法
    C#(WPF和WinForm)在普通类中调用到主线程的方法,SynchronizationContext的用法。
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6265346.html
Copyright © 2020-2023  润新知