Android Lollipop – PackageInstaller.Session commit ()

Estoy tratando de instalar paquetes en mi dispositivo (desde una aplicación de propietario de dispositivo que se ejecuta en él) sólo mediante el uso de las API PackageInstaller y PackageManager. He estado buscando ejemplos pero no pude encontrar nada que se ajuste a mi necesidad.

Aquí hay una muestra de mi código para instalar la aplicación de Facebook:

PackageManager pm = getPackageManager(); PackageInstaller mPackageInstaller = pm.getPackageInstaller(); PackageInstaller.SessionParams mSessionParams = new PackageInstaller.SessionParams(SessionParams.MODE_FULL_INSTALL); mSessionParams.setReferrerUri(Uri.parse("file:///mnt/sdcard/Download/Facebook.apk")); int mSessionId = mPackageInstaller.createSession( mSessionParams ); PackageInstaller.Session mPkgSession = PackageInstaller.openSession(mSessionId); OutputStream mOStream = mPkgSession.openWrite("com.facebook.katana", 0, -1); mPkgSession.fsync(mOStream); 

Supongo que la siguiente función que necesito lanzar es "commit (IntentSender statusReceiver)".

Por favor, dígame cómo utilizar commit () y sobre todo cómo declarar un IntentSender adecuado para instalar el APK que se almacena en / sdcard.

Gracias !!

    No puede instalar de forma silenciosa una aplicación de terceros en el usuario creado recientemente con PackageInstaller.Session.commit () sin "derechos" específicos. Usted necesita:

    El permiso INSTALL_PACKAGES. Sin embargo, este permiso no está disponible para aplicaciones de terceros. Así que incluso con su aplicación de propietario de perfil, no tendrá este permiso específico. Ejecute el proceso como ROOT_UID. Lo que significa que tendrá que arraigar el dispositivo.

    Esto es posible desde Android 6.0 y versiones posteriores.

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

    Una vez que su aplicación obtiene el permiso de propietario del dispositivo, podemos instalar, desinstalar y actualizar en silencio sin 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; } 

    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()); 

    Así que después de unos días buscando una manera de usar un IntentSender, me di cuenta de que en realidad está contenido en un PendingIntent.

    Aquí hay un código que se puede utilizar:

     Intent coucou = new Intent(this, ReceivedCommitActivity.class); coucou.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pCoucou = PendingIntent.getActivity(this, 0, coucou,0); IntentSender mIntentSender = pCoucou.getIntentSender(); mPkgSession.commit(mIntentSender); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.