Comment obtenir le fichier .apk d’une application par programmation

Je veux créer une application qui possède les fonctionnalités suivantes. Il devrait enregistrer son fichier .apk sur la carte SD . Imaginez que j’ai un Button . En cliquant dessus, je dois enregistrer le fichier .apk de l’application.

C’est facile à faire.

  1. Tout d’abord, vous obtenez toutes les applications installées,
  2. Pour chacun d’eux, récupérez le répertoire source public.
  3. copier le fichier sur la carte SD.

Note: Pas besoin d’être enraciné.

Voici le code snippt:

 final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); List apps = getPackageManager().queryIntentActivities(mainIntent, 0); for (ResolveInfo info : apps) { File file = new File(info.activityInfo.applicationInfo.publicSourceDir); // Copy the .apk file to wherever } 

Je ne connais pas de manière officielle. Cependant, il semble que l’APK soit stocké dans /data/app sous le nom de votre your.package.name-#.apk your.package.nameyour.package.name est le nom de votre paquet (par exemple com.google.earth ) et que # est généralement 1 ou 2, mais j’imagine que ça pourrait monter plus. À moins que votre appareil ne soit rooté, vous ne disposez pas des permissions nécessaires pour répertorier les fichiers dans /data/app mais vous devez avoir un access en lecture au fichier réel. Vous pouvez essayer de copier ce fichier (commencer par 1 et incrémenter jusqu’à ce que vous le trouviez) sur la carte SD.

Si vous avez un access à Internet, vous pouvez également stocker l’APK dans un emplacement Web et le télécharger directement sur la carte SD.

Il est facile de trouver et d’obtenir tout le fichier apk de l’application installée via une fonction simple. Ci-dessous, j’ai écrit une méthode qui renvoie un object HashMap qui contient tout le chemin absolu du fichier apk installé avec son nom de package correspondant. J’espère que cela vous sera très utile.

 private HashMap getAllInstalledApkFiles(Context context) { HashMap installedApkFilePaths = new HashMap<>(); PackageManager packageManager = context.getPackageManager(); List packageInfoList = packageManager.getInstalledPackages(PackageManager.SIGNATURE_MATCH); if (isValid(packageInfoList)) { for (PackageInfo packageInfo : packageInfoList) { ApplicationInfo applicationInfo; try { applicationInfo = getApplicationInfoFrom(packageManager, packageInfo); Ssortingng packageName = applicationInfo.packageName; Ssortingng 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 packageInfos) { return packageInfos != null && !packageInfos.isEmpty(); } 

Maintenant, vous appelez la méthode suivante pour obtenir le fichier apk pour un nom de package particulier:

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

et la méthode getApplicationInfoFrom :

 private ApplicationInfo getApplicationInfoFrom(PackageManager packageManager, PackageInfo packageInfo) { return packageInfo.applicationInfo; }