获取apk文件的图标、版本和名称。

16

有没有一种方式可以获取未安装应用程序的应用程序名称、版本和应用程序图标?(针对存储在SD卡上的某些APK文件)


你能找到版本号吗?如果可以,请发布你的答案。 - Shirish Herwade
5个回答

74

我刚花费了比我愿意承认的更多时间来寻找这个解决方案...并且找到了! :) :)

在查看这个参考文献后: http://code.google.com/p/android/issues/detail?id=9151 我发现了一个小技巧,可以获取未安装的apk文件中的图标和名称(即标签)。

希望现在还能帮助其他人:

 String APKFilePath = "mnt/sdcard/myapkfile.apk"; //For example...
 PackageManager pm = getPackageManager();
 PackageInfo    pi = pm.getPackageArchiveInfo(APKFilePath, 0);

 // the secret are these two lines....
 pi.applicationInfo.sourceDir       = APKFilePath;
 pi.applicationInfo.publicSourceDir = APKFilePath;
 //

 Drawable APKicon = pi.applicationInfo.loadIcon(pm);
 String   AppName = (String)pi.applicationInfo.loadLabel(pm);

经过轻微测试,它似乎能够正常工作...呼。


一定要将其标记为正确答案:必须,必须,必须。非常有帮助,谢谢 :) - AZ_
2
版本是多少?如何获取它? - Shirish Herwade
@ShirishHerwade 它已经在“pi”变量中了。版本代码:http://developer.android.com/reference/android/content/pm/PackageInfo.html#versionCode,版本名称:http://developer.android.com/reference/android/content/pm/PackageInfo.html#versionName - android developer
能否找到 APK 的意图过滤器? - android developer
运行得非常好。应该标记为最佳答案。 - dazed
显示剩余2条评论

13

我已经尝试过:

PackageInfo info = getPackageManager().getPackageArchiveInfo(fullPath, 0);
ApplicationInfo appinfo = info.applicationInfo;
label = getPackageManager().getApplicationLabel(appinfo).toString();
img = getPackageManager().getApplicationIcon(info.packageName);

但如果apk没有安装,这段代码将无法工作。


7
我可以使用getPackageArchiveInfo(archiveFilePath, flags)getApplicationIcon(ApplicationInfo info)来获取apk图标、版本和名称。

7
无法使用未安装的应用程序 :(,只返回默认的应用程序图标。 - Ragunath Jawahar
这不应该被接受为答案,因为它没有回答问题。@POMATu请将Tam的答案标记为被接受的答案。 - Phani Rithvij

5
// Install a known apk file from the SD-Card
// or launch it if installed. 
// -hsigmond

protected void runAppFromApkFileOnSdCard() {

        final PackageManager pm = getActivity().getPackageManager();
        String apkFileName      = "application_name.apk";
        String fullPath         = "/sdcard/"+apkFileName;
        PackageInfo packageInfo = pm.getPackageArchiveInfo(fullPath, 0);
        Intent intent           = pm.getLaunchIntentForPackage(packageInfo.packageName);

        if( intent == null ){
            File file   = new File(fullPath);
            intent      = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(file),
            "application/vnd.android.package-archive");
        }
        startActivity(intent);
    }

使用:

packageInfo.applicationInfo.['name','icon','logo'] etc.

示例图标:

Drawable icon = packageInfo.applicationInfo.loadIcon(getActivity().getPackageManager());

我尝试过这个,但是packageInfo始终为null。我缺少某些权限吗? - 1HaKr
在三星Galaxy Tab 8.9上为我工作,Android版本为3.2。如果应用程序尚未安装,则packageInfo不为空,intent为空。 - giacatho

0

正如您所发现的那样,PackageManager 只有在应用程序已安装时才对您有用。

为了解决您在不安装应用程序的情况下获取信息的问题,请使用APK提取器,请参见:http://code.google.com/p/apk-extractor/downloads/detail?name=APK-Extractor-src-1.0.zip&can=2&q=

该项目旨在开发一个公开可用的解析器,可以解析Android的二进制XML。AAPT(Android资产打包工具)以Google自己的专有二进制XML格式编码/解码XML资源。人们普遍认为这是一种通用的WBXML格式,任何支持WBXML的解析器都可以解析它。但这是不正确的。

如果您计划探索Android的二进制XML,则我的代码库可以帮助您开始并构建基于其上的服务。

版本1.0-能够解析Android清单、XML布局等,并将DEX / ODEX转换为CLASS,可以被任何反编译器打开。

他的博客在这里: http://prasanta-paul.blogspot.com/2012/03/android-apk-extractor.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接