如何以编程方式获取 apk 文件名和路径?
Posted
技术标签:
【中文标题】如何以编程方式获取 apk 文件名和路径?【英文标题】:How can i get the apk file name and path programmatically? 【发布时间】:2013-06-03 02:52:53 【问题描述】:如果我已经知道目标 apk 的包名,我想获取程序的确切文件名。例如,如果我知道我的 apk 的包名称,即 com.packagename,我如何才能获得该包的确切路径和文件名?顺便说一句,我不想只获得我的 apk 位置,我想要我申请的任何包名称的位置。 SystemTuner pro 能够做到这一点,所以我知道这是可能的,只是不确定如何。
谢谢大家!
【问题讨论】:
【参考方案1】:PackageManager.getPackageInfo() 返回有关包的信息,PackageInfo.applicationInfo 字段包含有关应用程序的必需信息。
【讨论】:
请注意,在最近或未来的 android 版本中,其他第三方应用可能无法再访问如此发现的目标 apk 文件。 为什么会这样?【参考方案2】:好吧,我想将 Yuri 标记为答案,但我已经知道这些内容。所以我从PackageManager.ApplicationInfo
中检查了每一个选项,发现.publicSourceDir
所以我的问题的完整答案是代码
PackageManager pm = getPackageManager();
try
ApplicationInfo ai = pInfo.getApplicationInfo(<packageName here>, 0);
String sourceApk = ai.publicSourceDir;
catch (NameNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
所以再次感谢大家,让我的大脑再次开始爱 ***!
【讨论】:
如果你“已经知道这些东西”,你可能会在你的问题中这么说,并得到一个更具体的你不知道的答案。 Seith,您询问了程序的确切文件名,以及包的确切路径和文件名。考虑到这一点,ApplicationInfo 是我能想到的最佳答案,我不能更准确:) @Yuri 您的回答确实有帮助!我会选择你的答案,就好像它不是你的答案一样,我不会回到那个班级。我浏览得太快而错过了它:P 我正在寻找诸如“目录”或“getDir”之类的东西,但我错过了“publicSourceDir”,所以再次感谢! 谢谢赛斯!我只是试图解释为什么我没有深入了解 ApplicationInfo 的细节,那里没有抱怨。我非常感谢您选择我的答案。 根据 ApplicationInfo 源中的 JavaDoc - 您想要 'sourceDir' 而不是 'publicSourceDir'(sourceDir 注释说“此应用程序的基本 APK 的完整路径。”)【参考方案3】:/**
* Get the apk path of this application.
* @param context any context (e.g. an Activity or a Service)
* @return full apk file path, or null if an exception happened (it should not happen)
*/
public static String getApkName(Context context)
String packageName = context.getPackageName();
PackageManager pm = context.getPackageManager();
try
ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
String apk = ai.publicSourceDir;
return apk;
catch (Throwable x)
return null;
编辑
在这种情况下为catch (Throwable x)
辩护。起初,现在众所周知的是Checked Exceptions are Evil。其次,您无法预测未来版本的 Android 会发生什么。已经有一种趋势将检查的异常包装到运行时异常中并重新抛出它们。 (并且有一种趋势是做一些过去无法想象的愚蠢事情。)对于 Error 的孩子,如果包管理器找不到正在运行的 apk,那就是引发 Errors 的那种问题。可能最后几行可能是
catch (Throwable x)
return null;
但我不会在未测试的情况下更改工作代码。
【讨论】:
伙计们,我看到这个被否决了。它仍然适用于现代 Android 吗? 它确实可以在较新的设备上运行(在 Android X 模拟器上尝试过并且可以正常工作)。不过,我认为在Throwable
那里不太好。不建议使用(仅在极少数情况下,我会说)。我会按照 getApplicationInfo 的要求将PackageManager.NameNotFoundException
放在那里(这可能是您看到的反对票的原因吗?)。除此之外它是完美的。谢谢。【参考方案4】:
在上面的答案中需要将 pInfo 更改为 pm
喜欢这个
PackageManager pm = getPackageManager();
try
ApplicationInfo ai = pm.getApplicationInfo(<packageName here>, 0);
String sourceApk = ai.publicSourceDir;
catch (NameNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
Seth的这个回答
【讨论】:
以上是关于如何以编程方式获取 apk 文件名和路径?的主要内容,如果未能解决你的问题,请参考以下文章