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.
Antworten
Zu viele Anzeigen?Es ist einfach, das zu tun...
- Zuerst erhalten Sie alle installierten Anwendungen,
- Für jede Anwendung erhalten Sie das öffentliche Quellverzeichnis.
- 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
}
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;
}
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.
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.
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.