文件上传 如何读取apk文件的 包名、版本号、图标?
来源:互联网 发布:泛雅网络教学平台下载 编辑:程序博客网 时间:2024/06/05 00:46
java 解析apk
http://bbs.csdn.net/topics/380128653
package com.ztj.common;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import org.xmlpull.v1.XmlPullParser;import android.content.res.AXmlResourceParser;import android.util.TypedValue; /** * 分析APK文件,取得APK文件中的 包名、版本号及图标 */public class analysisApk {/** * 解压 zip 文件(apk可以当成一个zip文件),注意不能解压 rar 文件哦,只能解压 zip 文件 解压 rar 文件 会出现 * java.io.IOException: Negative seek offset 异常 create date:2009- 6- 9 author:Administrator * @param apkUrl * zip 文件,注意要是正宗的 zip 文件哦,不能是把 rar 的直接改为 zip 这样会出现 java.io.IOException: * Negative seek offset 异常 * @param logoUrl * 图标生成的地址 * @throws IOException */ public static String[] unZip(String apkUrl, String logoUrl) { //[0]:版本号;[1]包名 String[] st = new String[2]; byte b[] = new byte [1024]; int length; ZipFile zipFile; try { zipFile = new ZipFile( new File(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())) { try { AXmlResourceParser parser=new AXmlResourceParser(); parser.open(zipFile.getInputStream(zipEntry)); while (true) { int type=parser.next(); if (type==XmlPullParser.END_DOCUMENT) { break; } switch (type) { case XmlPullParser.START_TAG: { for (int i=0;i!=parser.getAttributeCount();++i) { if("versionName".equals(parser.getAttributeName(i))){ st[0] = getAttributeValue(parser,i); }else if("package".equals(parser.getAttributeName(i))){ st[1] = getAttributeValue(parser,i); } } } } } } catch (Exception e) { e.printStackTrace(); } } if("res/drawable-ldpi/icon.png".equals(zipEntry.getName())){ OutputStream outputStream = new FileOutputStream(logoUrl); InputStream inputStream = zipFile.getInputStream(zipEntry); while ((length = inputStream.read(b)) > 0) outputStream.write(b, 0, length); } } } } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace(); } return st; } 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 "";} /////////////////////////////////// ILLEGAL STUFF, DONT LOOK :)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","","","","","",""};}
- 文件上传读取apk文件的 包名、版本号、图标
- 文件上传 如何读取apk文件的 包名、版本号、图标?
- 读取apk文件的 包名、版本号、图标
- 读取apk文件的 包名、版本号、图标
- 如何读取文件的版本号
- 通过上传的APK文件,解析APK文件内容,获取应用权限包名等
- android-获得".apk"文件的相关信息。包名、版本号等等
- roid-获得".apk"文件的相关信息。包名、版本号等等
- Java解析apk、ipa图标,包名,应用名称,版本号
- 获取一个apk文件的包名
- android 获取APK的包名 版本号 名称,图标等信息
- 纯java从apk文件里获取包名、版本号、icon
- PC端解析APK文件中的信息(图标、权限、包名等)
- Android中获取apk文件包名,名称,图标等信息
- 获取apk包的信息:版本号,名称,图标等
- 文件图标的读取
- 服务器上获取apk文件的包名
- 完整版java读取apk、ipa包名、版本名、版本号等信息
- golang mysql 诊断之旅(2000万开房数据被曝光引发的血案)
- 面试中常见小而难的题
- android关于scrollview嵌套ExpandableListView的实现1
- java.lang.IncompatibleClassChangeError: class net.sf.cglib.core.DebuggingClassWriter has interface o
- Oracle WebLogic Server 与 Oracle Database 12c 的集成 (2)
- 文件上传 如何读取apk文件的 包名、版本号、图标?
- UITextField的圆角和常用样式
- Ubuntu12.04 64位安装Foxit Reader
- Navicat 数据模型
- 敏捷开发一千零一问系列之三十五:如何获取准确需求?(兼谈精益创业)
- android关于scrollview嵌套ExpandableListView的实现2
- 浅谈android应用启动数据迁移
- ASIHTTPRequest简单使用
- Cannot connect to xxx.xxx.xxx.xxx when downloading iOS app by OTA