Подтвердить что ты не робот

Как получить файл .apk приложения программным путем

Я хочу создать приложение, которое имеет следующие функциональные возможности. Он должен .apk на sdcard. Представьте, что у меня есть Button. При нажатии на нее я должен сохранить файл .apk приложения.

4b9b3361

Ответ 1

Это легко сделать.

  • Сначала вы получаете все установленные приложения,
  • Для каждого из них вы получите общедоступный исходный каталог.
  • скопируйте файл на SDCard.

Примечание. Не нужно корениться.

Вот код 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
}

Ответ 2

Я не знаю официального пути. Тем не менее, кажется, что APK хранится в /data/app с именем файла your.package.name-#.apk, где your.package.name - это ваше имя пакета (например, com.google.earth) и # обычно 1 или 2, но я полагаю, что это может пойти больше. Если ваше устройство не внедрено, у вас нет прав на просмотр файлов в /data/app, но вы должны иметь доступ к чтению к фактическому файлу. Вы можете попытаться скопировать этот файл (начиная с 1 и увеличивать до тех пор, пока не найдете его) на SD-карту.

В качестве альтернативы, если у вас есть доступ в Интернет, вы можете сохранить APK в каком-либо веб-месте и загрузить его прямо на SD-карту.

Ответ 3

Легко найти и получить все установленное приложение 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;
    }