installer / désinstaller les Apk par programme (PackageManager vs Intentions)

Mon application s'installe d'autres applications, et il a besoin de garder une trace de ce que les applications qu'il a installé. Bien sûr, cela pourrait être réalisé en gardant simplement une liste des applications installées. Mais cela ne devrait pas être nécessaire! Il devrait être de la responsabilité de l'PackageManager pour maintenir la installedBy(a, b) de la relation. En fait, selon l'API, il est:

public abstract String getInstallerPackageName(String packageName) -
Récupérer le nom du package de l'application qui a installé un paquet. Ce qui identifie le marché provient le paquet.

L'approche actuelle

Installer APK en utilisant l'Intention de

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);

Désinstaller APK en utilisant l'Intention:

Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);

Ce n'est évidemment pas la façon dont par exemple l'Android Market s'installe /désinstalle les paquets. Ils utilisent une version enrichie de la PackageManager. Cette montre en téléchargeant le code source Android à partir de l'Android dépôt Git. Ci-dessous sont les deux cachés méthodes qui correspond à l'Intention de l'approche. Malheureusement, ils ne sont pas disponibles à des développeurs externes. Mais peut-être qu'ils le seront dans le futur?

La meilleure approche

Installer APK en utilisant les 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);

Désinstallation APK en utilisant les 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);

Différences

  • Lors de l'utilisation de modes locaux gestionnaire de paquets n'est pas informé de l'application de l'installation provient. Plus précisément, getInstallerPackageName(...) renvoie la valeur null.

  • Cachés méthode installationprogiciel(...) prend le package d'installation nom en tant que paramètre, et est le plus susceptible capable de régler cette valeur.

Question

il Est possible de spécifier le package de l'installateur nom de l'aide intentions?
(Peut-être le nom du package du programme d'installation peut être ajouté comme un supplément à l'installation de l'intention?)

Astuce: Si vous souhaitez télécharger le code source Android, vous pouvez suivre les étapes décrites ici: Téléchargement de l'Arbre Source. Pour extraire l' *.java fichiers et les mettre dans des dossiers en fonction de la hiérarchie des paquets, vous pouvez vérifier cet soigné script: Afficher le Code Source Android dans Eclipse.

  • Certains des URIs sont manquants dans le texte. Je les ajouterai dès que j'ai le droit de (nouveaux utilisateurs a quelques restrictions pour éviter le spam).
  • comment désactiver la fonctionnalité de désinstallation ?
  • "comment désactiver la fonctionnalité de désinstallation ?" - Travailler sur certains difficiles à désinstaller les logiciels malveillants, en sommes-nous?