49 Stimmen

Wie man die .apk-Datei einer Anwendung programmgesteuert erhält

Ich möchte eine Anwendung erstellen, die über die folgende Funktionalität verfügt. Sie sollte ihre .apk-Datei auf der sdcard speichern. Stellen Sie sich vor, ich habe eine Schaltfläche. Wenn ich darauf klicke, muss ich die .apk-Datei der Anwendung speichern.

62voto

Bassel Kh Punkte 1852

Es ist einfach, das zu tun...

  1. Zuerst erhalten Sie alle installierten Anwendungen,
  2. Für jede Anwendung erhalten Sie das öffentliche Quellverzeichnis.
  3. Kopieren Sie die Datei auf die SDCard.

Hinweis: Kein Root-Zugriff erforderlich.

Hier ist der Code-Schnippt:

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);
    // Kopieren Sie die .apk-Datei, wohin auch immer
}

4voto

Shiba Prasad J. Punkte 387

Es ist einfach, alle installierten App-APK-Dateien über eine einfache Funktion zu finden und zu erhalten. Unten habe ich eine Methode geschrieben, die ein HashMap-Objekt zurückgibt, das den absoluten Pfad aller installierten APK-Dateien mit ihren entsprechenden Paketnamen enthält. Ich hoffe, es wird für Sie sehr nützlich sein.

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

                    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 packageInfos) {
        return packageInfos != null && !packageInfos.isEmpty();
    }

Jetzt rufen Sie die folgende Methode auf, um die APK-Datei für einen bestimmten Paketnamen zu erhalten:

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

        return null;
    }

und die Methode getApplicationInfoFrom:

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

3voto

kabuko Punkte 35597

Ich kenne keine offizielle Methode. Es scheint jedoch, dass die APK in /data/app mit dem Dateinamen your.package.name-#.apk gespeichert wird, wobei your.package.name Ihr Paketname ist (z. B. com.google.earth) und # normalerweise 1 oder 2 ist, aber ich denke, es könnte noch höher gehen. Wenn Ihr Gerät nicht gerootet ist, haben Sie keine Berechtigungen, die Dateien in /data/app aufzulisten, aber Sie sollten Lesezugriff auf die tatsächliche Datei haben. Sie können versuchen, diese Datei (beginnen Sie mit 1 und erhöhen Sie sie, bis Sie sie finden) auf die SD-Karte zu kopieren.

Alternativ, wenn Sie Internetzugriff haben, könnten Sie die APK an einem Webstandort speichern und direkt auf die SD-Karte herunterladen.

0voto

Mrudul Tora Punkte 567

Sie können die PackageManager und ApplicationInfo Klasse für diesen Zweck verwenden.

List packagelist = new ArrayList<>();
File file;
PackageManager packageManager = getPackageManager();
packagelist = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
if (packagelist.size() > 0) {
        for (int i = 0; i < packagelist.size(); i++) {
            file = new File(packagelist.get(i).publicSourceDir);
   }

So erhalten Sie den publicSourceDir jeder apk. Dann können Sie diese apk einfach in einem bestimmten Ordner kopieren. In diesem Fall ist kein ROOT erforderlich.

Ich habe eine ähnliche App erstellt, um die apk sowohl von System- als auch von installierten Apps zu extrahieren. Sie hat viele weitere Funktionen. Hier ist der Link zum Quellcode und zur App. Schauen Sie sie sich an.

App im Google PlayStore anzeigen

Quellcode auf Github anzeigen

0voto

Tom Rutchik Punkte 727

Hier ist der einfachste Weg, den ich kenne, um den Pfad zur APK-Datei Ihrer Anwendung zu erhalten:

String classname = "com.mycompany.app.MyActivity";
String apkPath = activity.getApplication().getPackageManager().getApplicationInfo(classname, 0).sourceDir

Der Klassenname ist der Name Ihrer Anwendungsaktivität oder der AppCompatActivity-Klasse.

Dieser Aufruf würde etwas Ähnliches zurückgeben:

/data/app/com.mycompany.app.MyActivity-89lzYNI0vTAV056RT-WHBw==/base.apk

Sie können die Datei lesen, aber Sie können nicht schreiben, da sie geschützt ist. Und natürlich ist base.apk ein Jar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X