Mi aplicación instala otras aplicaciones y necesita realizar un seguimiento de las aplicaciones que ha instalado. Por supuesto, esto podría lograrse simplemente manteniendo una lista de las aplicaciones instaladas. ¡Pero esto no debería ser necesario! Debería ser responsabilidad del PackageManager mantener la relación instalada ByB (a, b). De hecho, según la API es:
public abstract String getInstallerPackageName (String packageName): recupera el nombre del paquete de la aplicación que instaló un paquete. Esto identifica de qué mercado proviene el paquete.
El enfoque actual
Instalar APK usando Intención
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);
Desinstalar APK usando Intención:
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);
Obviamente, esta no es la forma, por ejemplo, Android Market instala / desinstala paquetes. Usan una versión más rica del PackageManager. Esto se puede ver descargando el código fuente de Android desde el repositorio de Android Git. A continuación se muestran los dos métodos ocultos que corresponden al enfoque de intención. Lamentablemente, no están disponibles para desarrolladores externos. Pero tal vez lo serán en el futuro?
El mejor enfoque
Instalar APK usando el 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);
Desinstalar APK usando el 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);
Las diferencias
Al usar intentos, el administrador de paquetes local no tiene conocimiento de qué aplicación se originó la instalación. Específicamente, getInstallerPackageName (...) devuelve nulo.
El método oculto installPackage (...) toma el nombre del paquete del instalador como parámetro y es muy probable que sea capaz de establecer este valor.
Pregunta
¿Es posible especificar el nombre del instalador del paquete usando intentos? (¿Tal vez el nombre del paquete de instalación se puede agregar como un extra a la intención de instalación?)
Consejo: Si desea descargar el código fuente de Android, puede seguir los pasos descritos aquí: Descargar el árbol de fuentes. Para extraer los archivos * .java y colocarlos en carpetas de acuerdo con la jerarquía del paquete, puede consultar este script ordenado: Ver el código fuente de Android en Eclipse .