Cómo obtener el archivo .apk de una aplicación mediante programación

Quiero crear una aplicación que tenga la siguiente funcionalidad. Debe guardar su archivo .apk en la tarjeta sd . Imagina que tengo un Button . Al hacer clic en él, tengo que guardar el archivo .apk de la aplicación.

Es fácil de hacer eso

  1. Primero obtiene todas las aplicaciones instaladas,
  2. Para cada uno, obtener el directorio de fuentes públicas.
  3. Copie el archivo a la tarjeta SD.

Nota: No es necesario arraigar.

Aquí está el código 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 } 

No sé de una manera oficial. Sin embargo, parece que el APK se almacena en /data/app con el nombre de archivo de your.package.name-#.apk your.package.name donde your.package.name es el nombre del paquete (por ejemplo, com.google.earth ) y # suele ser 1 O 2, pero me imagino que podría subir más. A menos que su dispositivo esté enraizado, no tiene permisos para listar los archivos en /data/app pero debería tener acceso de lectura al archivo real. Puede intentar copiar ese archivo (comience con 1 e incremente hasta que lo encuentre) en la tarjeta SD.

Como alternativa, si tiene acceso a Internet, puede almacenar el APK en una ubicación web y descargarlo directamente a la tarjeta SD.

Es fácil encontrar y obtener todo el archivo apk de la aplicación instalada a través de una función simple. A continuación escribí un método que devuelve un objeto HashMap que contiene toda la ruta absoluta del archivo apk instalado con su nombre de paquete correspondiente .. Espero que sea muy útil para usted.

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

Ahora debe llamar al siguiente método para obtener el archivo apk para un nombre de paquete específico:

 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; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.