qué que program google english documentacion develops developers developer blog silent-installer kiosk-mode android-6.0-marshmallow device-owner packageinstaller

silent-installer - program - que es el packageinstaller



PackageInstaller "Instalación y desinstalación silenciosa de aplicaciones por parte del propietario del dispositivo"-Vista previa de Android M (2)

Esto es posible desde Android 6.0 en adelante.

  • Haz de tu aplicación el propietario del dispositivo.

Una vez que su aplicación obtenga el permiso del propietario del dispositivo, podemos instalar, desinstalar y actualizar en silencio sin la intervención del usuario.

public static boolean installPackage(Context context, InputStream in, String packageName) throws IOException { PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); params.setAppPackageName(packageName); // set params int sessionId = packageInstaller.createSession(params); PackageInstaller.Session session = packageInstaller.openSession(sessionId); OutputStream out = session.openWrite("COSU", 0, -1); byte[] buffer = new byte[65536]; int c; while ((c = in.read(buffer)) != -1) { out.write(buffer, 0, c); } session.fsync(out); in.close(); out.close(); session.commit(createIntentSender(context, sessionId)); return true; } private static IntentSender createIntentSender(Context context, int sessionId) { PendingIntent pendingIntent = PendingIntent.getBroadcast( context, sessionId, new Intent(ACTION_INSTALL_COMPLETE), 0); return pendingIntent.getIntentSender(); }

Desinstalar

String appPackage = "com.your.app.package"; Intent intent = new Intent(getActivity(), getActivity().getClass()); PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0); PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller(); mPackageInstaller.uninstall(appPackage, sender.getIntentSender());

Completa la aplicación de demostración del propietario del dispositivo en este repo .

El PackageInstaller ( https://developer.android.com/reference/android/content/pm/PackageInstaller.html ) parece haberse agregado a partir de la API 21 (Lollipop), sin embargo, no he encontrado ningún ejemplo de código sólido sobre cómo instalar un APK a través de esta API. Cualquier código de ayuda sería apreciado.

Estoy investigando las aplicaciones COSU / Kiosk para Android M Preview y estaba intentando implementar la nueva función "Instalación y desinstalación silenciosa de aplicaciones por parte del propietario del dispositivo" ( https://developer.android.com/preview/api-overview.html#afw ) a través de la API PackageInstaller.

Encontré estos, pero no me ayudó: ¿Cómo instalar / actualizar / eliminar APK usando la clase "PackageInstaller" en Android L? ¿Qué es la clase "PackageInstaller" en Lollipop y cómo usarla?

Tampoco encontré ninguna aplicación de muestra de Android.

Gracias por adelantado.


Lo descubrí, aquí está el código:

try { PackageInstaller pi = app.getPackageManager().getPackageInstaller(); int sessId = pi.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)); PackageInstaller.Session session = pi.openSession(sessId); // .. write updated APK file to out long sizeBytes = 0; final File file = new File(filepathApk); if (file.isFile()) { sizeBytes = file.length(); } InputStream in = null; OutputStream out = null; in = new FileInputStream(filepathApk); out = session.openWrite("my_app_session", 0, sizeBytes); int total = 0; byte[] buffer = new byte[65536]; int c; while ((c = in.read(buffer)) != -1) { total += c; out.write(buffer, 0, c); } session.fsync(out); in.close(); out.close(); System.out.println("InstallApkViaPackageInstaller - Success: streamed apk " + total + " bytes"); // fake intent Context app = this; Intent intent = new Intent(app, AlarmReceiver.class); PendingIntent alarmtest = PendingIntent.getBroadcast(app, 1337111117, intent, PendingIntent.FLAG_UPDATE_CURRENT); session.commit(alarmtest.getIntentSender()); session.close(); } catch (Exception ex) { ex.printStackTrace(); }