0 0

怎么从SDK中获得未安装的APK信息(名称 图标)5

最近在做一个项目,怎么能够把SD卡中的APK文件扫描出来,我现在用File类里面的方法可以得到APK的名称,但是就是无法获得APK的图标,各位高手们指点迷津。

问题补充:
raito_yagami 写道
网上一搜一大把。。。

网上的那些复制粘贴的  能行我也就不会在这里请教大家了  我的代码是这样的



private void showUninstallAPKIcon(String apkPath) {

String PATH_PackageParser = "android.content.pm.PackageParser";
String PATH_AssetManager = "android.content.res.AssetManager";
try {
Class pkgParserCls = Class.forName(PATH_PackageParser);
Class[] typeArgs = new Class[1];
typeArgs[0] = String.class;
Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
Object[] valueArgs = new Object[1];
valueArgs[0] = apkPath;
Object pkgParser = pkgParserCt.newInstance(valueArgs);
Log.d("ANDROID_LAB", "pkgParser:" + pkgParser.toString());

// 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
// PackageParser.Package mPkgInfo = packageParser.parsePackage(new
// File(apkPath), apkPath,
// metrics, 0);
typeArgs = new Class[4];
typeArgs[0] = File.class;
typeArgs[1] = String.class;
typeArgs[2] = DisplayMetrics.class;
typeArgs[3] = Integer.TYPE;
Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(
"parsePackage", typeArgs);
valueArgs = new Object[4];
valueArgs[0] = new File(apkPath);
valueArgs[1] = apkPath;
valueArgs[2] = metrics;
valueArgs[3] = 0;
Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,
valueArgs);
// 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
// ApplicationInfo info = mPkgInfo.applicationInfo;
Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(
"applicationInfo");
ApplicationInfo info = (ApplicationInfo) appInfoFld
.get(pkgParserPkg);
// uid 输出为"-1",原因是未安装,系统未分配其Uid。
System.out
.println("****************ANDROID_LAB*********************"
+ "pkg:" + info.packageName + " uid=" + info.uid);
// Resources pRes = getResources();
// AssetManager assmgr = new AssetManager();
// assmgr.addAssetPath(apkPath);
// Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),
// pRes.getConfiguration());
Class assetMagCls = Class.forName(PATH_AssetManager);
Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);
Object assetMag = assetMagCt.newInstance((Object[]) null);
typeArgs = new Class[1];
typeArgs[0] = String.class;
Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(
"addAssetPath", typeArgs);
valueArgs = new Object[1];
valueArgs[0] = apkPath;
assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
Resources res = getResources();
typeArgs = new Class[3];
typeArgs[0] = assetMag.getClass();
typeArgs[1] = res.getDisplayMetrics().getClass();
typeArgs[2] = res.getConfiguration().getClass();
Constructor resCt = Resources.class.getConstructor(typeArgs);
valueArgs = new Object[3];
valueArgs[0] = assetMag;
valueArgs[1] = res.getDisplayMetrics();
valueArgs[2] = res.getConfiguration();
res = (Resources) resCt.newInstance(valueArgs);
CharSequence label = null;
if (info.labelRes != 0) {
label = res.getText(info.labelRes);
}
// if (label == null) {
// label = (info.nonLocalizedLabel != null) ? info.nonLocalizedLabel
// : info.packageName;
// }
Log.d("ANDROID_LAB", "label=" + label);
// 这里就是读取一个apk程序的图标
if (info.icon != 0) {
Drawable icon = res.getDrawable(info.icon);
ImageView image = (ImageView) findViewById(R.id.apkIconBySodino);
image.setVisibility(View.VISIBLE);
image.setImageDrawable(icon);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}




在执行到Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo");
会报空指针 05-11 10:00:10.960: WARN/PackageParser(1638): Skipping dir: /sdcardunionpay_jx.apk
05-11 10:00:10.960: WARN/System.err(1638): java.lang.NullPointerException
05-11 10:00:10.960: WARN/System.err(1638):     at com.java.FileExplemActivity.showUninstallAPKIcon(FileExplemActivity.java:119)
05-11 10:00:10.960: WARN/System.err(1638):     at com.java.FileExplemActivity.refresh(FileExplemActivity.java:66)
05-11 10:00:10.960: WARN/System.err(1638):     at com.java.FileExplemActivity.onCreate(FileExplemActivity.java:46)
05-11 10:00:10.960: WARN/System.err(1638):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-11 10:00:10.960: WARN/System.err(1638):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1618)
05-11 10:00:10.960: WARN/System.err(1638):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1670)
05-11 10:00:10.960: WARN/System.err(1638):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-11 10:00:10.960: WARN/System.err(1638):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-11 10:00:10.960: WARN/System.err(1638):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-11 10:00:10.960: WARN/System.err(1638):     at android.os.Looper.loop(Looper.java:123)
05-11 10:00:10.960: WARN/System.err(1638):     at android.app.ActivityThread.main(ActivityThread.java:3695)
05-11 10:00:10.960: WARN/System.err(1638):     at java.lang.reflect.Method.invokeNative(Native Method)
05-11 10:00:10.960: WARN/System.err(1638):     at java.lang.reflect.Method.invoke(Method.java:507)
05-11 10:00:10.960: WARN/System.err(1638):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
05-11 10:00:10.960: WARN/System.err(1638):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
05-11 10:00:10.960: WARN/System.err(1638):     at dalvik.system.NativeStart.main(Native Method)


不明白为什么会报这错误
2012年5月09日 16:29

2个答案 按时间排序 按投票排序

0 0

有可能是你的apkPath传的不对,你debug看看,传入绝对路径

2013年3月24日 21:33
0 0

网上一搜一大把。。。

2012年5月10日 17:47

相关推荐

    Android Apk包解析SDK

    Android Apk包解析SDK是一种工具或库,它允许开发者深入理解Apk的内容,提取关键信息,如包名、应用名称、图标等。此SDK特别强调对vector XML格式图标的处理,能够将它们转换为SVG,然后进一步转化为PNG格式,以适应...

    解析apk/ipa图标/名称/包名/版本号等信息

    理解如何解析这些文件中的元数据,如图标、名称、包名和版本号,对于开发者、安全分析人员以及应用市场审核者来说都是至关重要的。本文将深入探讨解析APK和IPA文件的相关知识点。 ### APK解析 #### 1. APK基础知识...

    Android获取已安装的apk信息

    本文将详细讲解如何通过编程方式获取Android设备上已安装的apk信息,包括应用图标、应用名称、工程名(包名)以及安装路径。 首先,我们需要了解在Android SDK中提供了一个名为`PackageManager`的类,它是获取应用...

    uniapp打包成apk ---完整解压资源sdk

    2. **uniapp项目配置**:在uniapp项目中,开发者需要在manifest.json文件中配置应用的基本信息,如应用名称、图标、版本号等。同时,也需要在HBuilderX中设置Android打包的相关选项,比如签名证书、最小API级别等。 ...

    APK Messenger APK信息查看工具

    PK Messenger 是一款电脑端APK信息文件提取工具,致力于做PC端最强大的APK信息查看工具。 本工具能够提供开发人员非常多的详细信息,秒杀apkhelper,apkinfo等同类信息读取工具 软件特色 获取应用名,支持提取多...

    安卓Apk包名信息查看工具

    3. **元数据检查**:除了基本的包名和版本信息,工具可能还会显示应用的标签(Label)、图标(Icon)、目标SDK版本、最低支持SDK版本等。 4. **权限分析**:列出Apk中申请的所有Android权限,帮助用户理解应用可能...

    APK信息查看工具

    通过这款工具,用户可以直接获取到APK的基本信息,包括但不限于应用名称、版本号、权限列表、图标、签名信息等。同时,它还能深入解析AndroidManifest.xml文件,这是每个Android应用的核心配置文件,包含了应用程序...

    Android 获取手机中已安装apk文件信息

    在Android系统中,获取手机中已安装的APK文件信息是一项常见的需求,这通常涉及到对设备上所有应用程序的管理和分析。`PackageManager`是Android提供的一个关键服务,它允许开发者获取到设备上安装的所有应用的信息...

    APKHelper_3.0 apk信息获取工具

    1. **应用程序元数据**:如应用的名称、版本号、签名信息、目标SDK版本等,这些都是构建和发布应用时的重要参数。 2. **权限列表**:显示应用请求的Android系统权限,有助于评估应用对用户隐私的影响。 3. **资源...

    ApkInfo APK信息查看神器

    获取应用名,支持提取多语言名称 获取包名,版本名,版本号,文件MD5 查壳功能,支持获取爱加密,360加固,梆梆加固,阿里云加固,腾讯乐固,百度加固,娜迦加固,顶象加固,通付盾,网秦,几维加固等壳信息 支持...

    ApkParser.zip

    //获取apk版本名称 $apkParser->getManifest()->getMinSdk(); // 支持最低sdk的平台 $apkParser->getManifest()->getMinSdkLevel(); // 支持最低sdk的版本 $apkParser->getManifest()->getTargetSdk(); // 目标...

    查看APK签名信息和版本号工具

    APK文件包含了应用的所有代码、资源、图标以及相关的配置信息。查看APK的签名信息和版本号是开发者在发布或调试应用时的重要步骤,确保应用的安全性和版本控制。在这个场景下,"查看APK签名信息和版本号工具"显然是...

    apk-parser

    此.jar文件包含了解析APK所需的所有功能,可以用来提取APK的各种元数据,如AndroidManifest.xml文件中的权限、应用名、版本信息、使用的SDK版本等。 “有jar包,源码及文档”这部分表示除了可直接使用的.jar文件外...

    详解如何制作APK安装器_源代码_MFC_VC

    在APK安装器中,我们可以利用aapt来获取APK的基本信息,如应用名称、版本号、图标等,展示给用户。 制作APK安装器的步骤大致如下: 1. **创建MFC项目**:使用Visual Studio创建一个新的MFC应用程序项目,选择适当...

    Java解析apk文件

    本篇文章将深入探讨如何使用Java解析APK文件,提取其中的关键信息,包括版本号码、版本名称、包名、权限、最低支持的Android平台版本、SDK版本以及应用程序的相关元数据。 首先,我们需要了解APK文件的结构。APK是...

    Android系统信息和Apk应用信息获取.rar

    在Android平台上,获取系统信息和Apk应用信息是开发者日常工作中常见的需求。这个压缩包"Android系统信息和Apk应用信息获取.rar"可能包含了多个示例或者库,用于帮助开发者实现这些功能。由于无法直接查看具体内容,...

    c#自动打包APK

    而APK则是Android应用的包文件格式,是Google Android系统中安装应用程序的标准方式。本项目聚焦于如何利用C#来实现自动打包APK的过程,这对于开发者来说是一项非常实用的技术,能够提高工作效率,特别是对于需要...

    Apk文件浏览器

    但Windows下那一堆的文件名甚至是包名根本分不清是哪个应用,为方便apk包在Windows下的管理,简单制作windows下的apk文件浏览器,原创首发,需要.net2.0及以上支持,可以查看apk包的信息,如:图标(所有图标,...

    apktoolmv2.4.0_downcc.com.apk

    快速编辑应用程序名称,程序包名称(克隆应用程序),应用程序图标等,而无需重建。 不需要根权限。 该应用程序是完全免费的,从Android 4.0开始,它在较旧的设备上受支持,并且不包含任何广告或分析。 应用特色 ...

    android 使用ant自动打包apk

    在Android开发过程中,自动化构建APK文件是提高效率的关键步骤之一。Ant是一个广泛使用的Java构建工具,它允许开发者通过XML配置文件定义构建过程。本文将详细介绍如何利用Ant来自动化打包Android应用(APK)。 ...

Global site tag (gtag.js) - Google Analytics