android-如何以编程方式获取应用程序的.apk文件

我想创建一个具有以下功能的应用程序。 它应该保存它的.apk文件到sdcard。 想象一下,我有一个Button。单击它时,我必须保存该应用程序的.apk文件。

KK_07k11A0585 asked 2020-06-30T03:00:02Z
3个解决方案
59 votes

这很容易做到..

  1. 首先,您将获得所有已安装的应用程序,
  2. 对于每个目录,获取公共源目录。
  3. 将文件复制到SDCard。

注意:无需扎根。

这是代码段代码:

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = getPackageManager().queryIntentActivities(mainIntent, 0);
for (ResolveInfo info : apps) {
    File file = new File(info.activityInfo.applicationInfo.publicSourceDir);
    // Copy the .apk file to wherever
}
Bassel Kh answered 2020-06-30T03:00:39Z
4 votes

通过一个简单的功能,即可轻松找到并获取所有已安装应用的apk文件。 下面,我写了一个方法,该方法返回一个HashMap对象,该对象保存所有已安装的apk文件的绝对路径及其相应的包名称。.我希望它对您很有用。

private HashMap<String, String> getAllInstalledApkFiles(Context context) {
        HashMap<String, String> installedApkFilePaths = new HashMap<>();

        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.SIGNATURE_MATCH);

        if (isValid(packageInfoList)) {
            for (PackageInfo packageInfo : packageInfoList) {
                ApplicationInfo applicationInfo;

                try {
                    applicationInfo = getApplicationInfoFrom(packageManager, packageInfo);

                    String packageName = applicationInfo.packageName;
                    String versionName = packageInfo.versionName;
                    int versionCode = packageInfo.versionCode;

                    File apkFile = new File(applicationInfo.publicSourceDir);
                    if (apkFile.exists()) {
                        installedApkFilePaths.put(packageName, apkFile.getAbsolutePath());
                        LogHelper.d(getClass(), packageName + " = " + apkFile.getName());
                    }
                } catch (PackageManager.NameNotFoundException error) {
                    error.printStackTrace();
                }
            }
        }

        return installedApkFilePaths;
    }

private boolean isValid(List<PackageInfo> packageInfos) {
        return packageInfos != null && !packageInfos.isEmpty();
    }

现在,您调用以下方法来获取特定包名称的apk文件:

public File getApkFile(Context context, String packageName) {
        HashMap<String, String> installedApkFilePaths = getAllInstalledApkFiles(context);
        File apkFile = new File(installedApkFilePaths.get(packageName));
        if (apkFile.exists()) {
            return apkFile;
        }

        return null;
    }

getApplicationInfoFrom方法:

private ApplicationInfo getApplicationInfoFrom(PackageManager packageManager, PackageInfo packageInfo) {
    return packageInfo.applicationInfo;
}
Shiba Prasad J. answered 2020-06-30T03:01:08Z
3 votes

我不知道官方的方式。 但是,APK似乎存储在/data/app中,文件名为your.package.name-#.apk,其中your.package.name是您的软件包名称(例如com.google.earth),而#通常为1或2,但我想它可能还会增加。 除非您的设备已植根,否则您无权在/data/app中列出文件,但您应具有对实际文件的读取权限。 您可以尝试将该文件(从1开始并递增,直到找到为止)复制到SD卡。

另外,如果您可以访问互联网,则可以将APK存储在某个网站上,然后直接将其下载到SD卡。

kabuko answered 2020-06-30T03:01:33Z
translate from https://stackoverflow.com:/questions/8307034/how-to-get-the-apk-file-of-an-application-programmatically