安卓:如何以编程方式获取安装程序文件名?

11

是否可能获取存储在 /sdcard/download/ 的安装程序文件名?我想要从我的应用中获取已安装它的apk文件名。是否有一种简便的方法,特别是对于非市场应用程序?


“安装程序文件名称”是什么意思?指的是apk的名称吗?如果是,为什么需要它?请添加更多细节。 - Valentin Rocher
是的,我想获取存储在SD卡上的apk名称。我创建了apk文件并将其存储在服务器上,当有人想要下载它时,服务器会生成具有唯一名称的文件,例如:“application00086.apk”。问题是:如何从我的应用程序中获取此唯一文件名,该应用程序在安装后存储在目录中:/data/app/。我发现了一个有趣的方法:getInstallerPackageName,但是此方法仅返回安装程序包名称,并且仅适用于在Android Market上分发的应用程序,我想获取安装程序文件名称,并且不想在Market上分发我的应用程序。 - Wolfie
@Wolfie:我和你遇到了同样的问题。你解决了吗?非常感谢! - hoang8f
我也有同样的问题。有人找到解决方案了吗? - Majid
2个回答

3

嗯,我不确定您所说的是SD卡还是下载文件夹,但您可以在系统/data目录中获取apk路径:

命令行:

$ adb shell pm list packages | grep mk.trelloapp
package:mk.trelloapp
$ adb shell pm path mk.trelloapp
package:/data/app/mk.trelloapp-1/base.apk

或者从您的Android应用程序代码中:(只需运行进程)

        Process exec = Runtime.getRuntime().exec("pm path mk.trelloapp");

        exec.waitFor();

        InputStream inputStream = exec.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

        StringBuilder builder = new StringBuilder();
        String line = null;
        while( ( line = br.readLine()) != null ) {
            builder.append(line);
        }

        String commandOutput = builder.toString();

上面的代码应该只会给你一个包含"package:/data/app/mk.trelloapp-1/base.apk"的字符串。

当你在/data目录中获取路径时,你可以尝试在其他目录中搜索相同(或类似)的文件(假设它没有被删除),因为安卓包在安装时被复制到/data目录中。


这并不是有用的。 OP想要能够获取已下载的APK文件的原始文件名,因为他的应用程序版本号编码为该文件名的一部分。/data的APK路径不包括此信息,因为它仅使用包名称。 - David Wasser

3
更好的方法是在清单文件中包含版本字符串。这确实是唯一可靠(且专业)的方法。Android不会将包含APK的文件名存储在任何地方,因此您无法获取它。
理论上,您可能可以使用FileObserver构建某个东西,以监视某些目录中的文件创建,并且每次创建具有扩展名.apk的文件时,您可以打开该文件,提取清单,查找APK的软件包名称,然后将其与文件名一起存储在某些持久性存储中。然后,当您需要获取版本信息时,可以查看持久存储以获取与所需软件包名称匹配的文件名。
当然,这仅适用于在其他APK文件被下载/安装之前安装了您的应用程序的设备上。这无法查找自己应用程序的文件名。

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