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

我想创build一个具有以下function的应用程序。 它应该保存它的.apk文件到SD卡 。 想象一下,我有一个Button 。 点击它,我必须保存应用程序的.apk文件。

这很容易做到这一点..

  1. 首先你得到所有安装的应用程序
  2. 对于每一个,获取公共源代码目录。
  3. 将文件复制到SD卡。

注意:不需要根植。

这是snippt代码:

 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 } 

我不知道一个官方的方式。 但是,它似乎像APK存储在/data/app的文件名your.package.name-#.apk其中your.package.name是您的包名(例如com.google.earth )和#通常是1或2,但我想它可以上升更多。 除非你的设备是根植的,否则你没有权限列出/data/app中的文件,但你应该可以读取实际的文件。 您可以尝试将该文件复制到SD卡(从1开始,直到find它为止)。

或者,如果您有互联网访问,则可以将APK存储在某个网站位置,并直接将其下载到SD卡。

通过一个简单的function很容易find并获取所有安装的应用程序的apk文件。 下面我写了一个方法,它返回一个HashMap对象,它包含所有已安装的apk文件的绝对path及其对应的包名称。我希望它对你非常有用。

 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; }