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("\n版本号:"+apkInfo.getVersionCode()+"\n版本名:"+apkInfo.getVersionName()+"\n包名:"+apkInfo.getApkPackage());
        //String str = "\n版本号:"+versionCode+"\n版本名:"+versionName+"\n包名:"+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("\n版本号:"+versionCode+"\n版本名:"+versionName+"\n包名:"+packageName);
//        String str = "\n版本号:"+versionCode+"\n版本名:"+versionName+"\n包名:"+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();
    }    
时间: 2024-10-12 23:21:23

java通过解析文件获取apk版本等信息的相关文章

C#获取apk版本信息

获取很多人都会问我为什么要写这个博客,原因很简单,这次研发apk版本信息的时候网上查了很多的资料都没有这方面的信息,因此这次功能完了想写下方法,如果以后博友们遇到了可以直接copy,不用花很多的时间,至少有了方向. 下面我就来说下获取apk版本信息所需要调用的dll吧,该程序集的版本信息为:0.85.4.369,注意哦这个版本信息很重要的,因为可能你下的很多版本都是无法用的. 下面我就来说下研发代码吧:代码可能有不周全的地方:由于时间紧急没有做优化了: using (ICSharpCode.Sh

android获取apk安装包信息

public class TestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  String archiveFilePath="sdcard/jb51.net.apk";//安装包路径  PackageManager p

前端解析ipa、apk安装包信息 —— app-info-parser

安装包只需要经过一次传输,另一次则是可以忽略不计的请求 安装 npm install app-info-parser # or yarn yarn add app-info-parser 使用 NPM引入: const AppInfoParser = require('app-info-parser') const parser = new AppInfoParser('../packages/xxx.apk') // or xxx.ipa parser.parse().then(result

java上传文件获取跟目录的办法

在java中获得文件的路径在我们做上传文件操作时是不可避免的.web 上运行1:this.getClass().getClassLoader().getResource("/").getPath();this.getClass().getClassLoader().getResource("").getPath();  得到的是 ClassPath的绝对URI路径.如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war/W

如何获取apk的签名信息?

在接入第三方功能时,经常要注册提交apk的签名信息 (sha1签名)? 获取apk签名信息的步骤: 1)修改apk后缀名为zip,解压得到其中的META-INF文件夹; 2)把META-INF文件夹放到C盘根目录下; 3)在dos面板中,  敲入命令:  keytool -printcert -file C:\META-INF\CERT.RSA  命令,即可获取sha1签名信息 ————————————————————————————> keytool主要用于制作数字证书; 如何通过keytoo

JAVA根据IP地址获取详细的地域信息

在系统中网站的头部一般都有显示是哪个城市的用户进入到网站的首页后默认城市应该是用户本地的城市信息例如北京网站就要根据你的IP地址的信息查询数据获取北京部分的数据呵呵当然我可能描述的不是很清楚但是可以理解成通过IP地址定位地理信息就行.很多人现在使用以QQ数据库为基础获取地址信息但不完整.而且不规范.互联网提供很多其他接口可以完成这项功能. 接口如下 通过淘宝IP地址库获取IP位置 1. 请求接口GEThttp://ip.taobao.com/service/getIpInfo.php?ip=[i

PHP获取APK的包信息

这段时间太忙了,一个月没有写博客了,稍微闲下来就感觉把在开发中遇到的问题记录下来 php上传安卓apk包的时候,需要获取安卓apk包内的信息 <?php /*解析安卓apk包中的压缩XML文件,还原和读取XML内容 依赖功能:需要PHP的ZIP包函数支持.*/ include('./Apkparser.php'); $appObj = new Apkparser(); $targetFile = a.apk;//apk所在的路径地址 $res = $appObj->open($targetFi

代码获取Android版本等信息

我手机的关于手机界面: 说明: 其中手机型号.Android版本.软件版本通过系统Build类得到,处理器信息.内核版本通过读取系统文件得到,基带版本信息通过反射得到. 源码: package com.example.shen.phoneinfo; import android.app.Activity; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.L

Java使用反射来获取成员变量泛型信息

Java通过指定类对应的Class对象,程序可以获得该类里包括的所有Field,不管该Field使用private修饰,还是使用public修饰.获得了Field对象后,就可以很容易的获得该Field的数据类型,例如,下面的代码便是获得该Field对象foeld的类型: Class<?> type = field.getType(); 但是通过这种方式只对普通类型的Field有效,如果该Field的类型是有泛型限制的类型,如Map<String,Integer>类型,则不能准确得到