Meine Anwendung installiert andere Anwendungen und muss nachverfolgen, welche Anwendungen sie installiert hat. Dies könnte natürlich erreicht werden, indem einfach eine Liste der installierten Anwendungen geführt wird. Das sollte aber nicht nötig sein! Es sollte in der Verantwortung des PackageManager liegen, die installierte By (a, b) -Beziehung aufrechtzuerhalten. In der Tat ist es laut API:
public abstract String getInstallerPackageName (String packageName) - Ruft den Paketnamen der Anwendung ab, die ein Paket installiert hat. Dies identifiziert, von welchem Markt das Paket kam.
Der aktuelle Ansatz
Installieren Sie APK mit Intent
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);
Deinstallieren Sie APK mit Intent:
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);
Dies ist offensichtlich nicht der Weg, z. B. installiert / deinstalliert Android Market Pakete. Sie verwenden eine umfangreichere Version des PackageManager. Dies kann durch Herunterladen des Android-Quellcodes aus dem Android Git-Repository festgestellt werden. Nachfolgend sind die beiden versteckten Methoden aufgeführt, die dem Intent-Ansatz entsprechen. Leider stehen sie externen Entwicklern nicht zur Verfügung. Aber vielleicht werden sie es in Zukunft sein?
Der bessere Ansatz
Installieren von APK mit dem PackageManager
/**
* @hide
*
* Install a package. Since this may take a little while, the result will
* be posted back to the given observer. An installation will fail if the calling context
* lacks the {@link android.Manifest.permission#INSTALL_PACKAGES} permission, if the
* package named in the package file's manifest is already installed, or if there's no space
* available on the device.
*
* @param packageURI The location of the package file to install. This can be a 'file:' or a
* 'content:' URI.
* @param observer An observer callback to get notified when the package installation is
* complete. {@link IPackageInstallObserver#packageInstalled(String, int)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #INSTALL_FORWARD_LOCK},
* {@link #INSTALL_REPLACE_EXISTING}, {@link #INSTALL_ALLOW_TEST}.
* @param installerPackageName Optional package name of the application that is performing the
* installation. This identifies which market the package came from.
*/
public abstract void installPackage(
Uri packageURI, IPackageInstallObserver observer, int flags,
String installerPackageName);
Deinstallation von APK mit dem PackageManager
/**
* Attempts to delete a package. Since this may take a little while, the result will
* be posted back to the given observer. A deletion will fail if the calling context
* lacks the {@link android.Manifest.permission#DELETE_PACKAGES} permission, if the
* named package cannot be found, or if the named package is a "system package".
* (TODO: include pointer to documentation on "system packages")
*
* @param packageName The name of the package to delete
* @param observer An observer callback to get notified when the package deletion is
* complete. {@link android.content.pm.IPackageDeleteObserver#packageDeleted(boolean)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #DONT_DELETE_DATA}
*
* @hide
*/
public abstract void deletePackage(
String packageName, IPackageDeleteObserver observer, int flags);
Unterschiede
Bei Verwendung von Absichten wird dem lokalen Paketmanager nicht mitgeteilt, von welcher Anwendung die Installation stammt. Insbesondere gibt getInstallerPackageName (...) null zurück.
Die versteckte Methode installPackage (...) verwendet den Namen des Installationspakets als Parameter und kann diesen Wert höchstwahrscheinlich festlegen.
Frage
Ist es möglich, den Namen des Paketinstallationsprogramms mit Absichten anzugeben? (Vielleicht kann der Name des Installationspakets als Extra zur Installationsabsicht hinzugefügt werden?)
Tipp: Wenn Sie den Android-Quellcode herunterladen möchten, können Sie die hier beschriebenen Schritte ausführen: Herunterladen des Quellbaums. Um die * .java-Dateien zu extrahieren und sie gemäß der Pakethierarchie in Ordnern abzulegen, können Sie dieses übersichtliche Skript überprüfen: Anzeigen des Android-Quellcodes in Eclipse .