Estoy interesado en saber si es posible instalar mediante programación un apk descargado dinámicamente desde una aplicación Android personalizada.
Puede lanzar fácilmente un enlace de Play Store o una solicitud de instalación:
Intent promptInstall = new Intent(Intent.ACTION_VIEW)
.setDataAndType(Uri.parse("content:///path/to/your.apk"),
"application/vnd.android.package-archive");
startActivity(promptInstall);
o
Intent goToMarket = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.package.name"));
startActivity(goToMarket);
Sin embargo, no puede instalar .apks sin el permiso explícito del usuario; no a menos que el dispositivo y su programa estén rooteados.
Bueno, cavé más profundo, y encontré fuentes de la aplicación PackageInstaller de Android Source.
https://github.com/android/platform_packages_apps_packageinstaller
Desde manifiesto encontré que requiere permiso:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
Y el proceso real de instalación se produce después de la confirmación
Intent newIntent = new Intent();
newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, mPkgInfo.applicationInfo);
newIntent.setData(mPackageURI);
newIntent.setClass(this, InstallAppProgress.class);
String installerPackageName = getIntent().getStringExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME);
if (installerPackageName != null) {
newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);
}
startActivity(newIntent);
Sí, es posible. Pero para eso necesitas que el teléfono instale fuentes no verificadas. Por ejemplo, slideMe hace eso. Creo que lo mejor que puedes hacer es comprobar si la aplicación está presente y enviar una intención para el Android Market. debe utilizar algo el esquema de url para android Market.
market://details?id=package.name
No se exactamente como iniciar la actividad pero si inicias una actividad con ese tipo de url. Debería abrir el android market y darte la opción de instalar las aplicaciones.