14

PackageInstaller (https://developer.android.com/reference/android/content/pm/PackageInstaller.html) sembra essere stato aggiunto a partire dall'API 21 (Lollipop), tuttavia non ho trovato esempi di codice solido su come installare un APK tramite questa API .Qualsiasi aiuto del codice sarebbe apprezzatoPackageInstaller "Installazione e disinstallazione invisibili di app dal proprietario del dispositivo" - Android M Preview

Sto indagando su app COSU/Kiosk per Android M Preview e stavo tentando di implementare la nuova funzionalità "Installazione e disinstallazione invisibili di app dal proprietario del dispositivo" (https://developer.android.com/preview/api-overview.html#afw) tramite l'API PackageInstaller.

trovato questi, ma non è utile: How to install/update/remove APK using "PackageInstaller" class in Android L? What's "PackageInstaller" class on Lollipop, and how to use it?

non abbiamo trovato nessun campione applicazioni Android sia.

Grazie in anticipo.

+0

possibile duplicato di [Come installare/aggiornare/rimuovere APK utilizzando la classe "PackageInstaller" in Android L?] (Http://stackoverflow.com/questions/26884956/how-to-install-update-remove-apk- using-packageinstaller-class-in-android-l) – Kenneth

+0

Come @Kenneth cita, sembra una [risposta] (http://stackoverflow.com/a/27520814/2050) fornisce il codice di esempio cercato. –

risposta

2

capito, ecco il codice:

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(); 
    } 
+0

Cosa fa la classe 'AlarmReceiver'? –

4

Questo è possibile da Android 6.0 in su.

  • Rendi la tua app proprietaria del dispositivo.

Una volta che l'app ottiene l'autorizzazione del proprietario del dispositivo, possiamo installare, disinstallare e aggiornare in silenzio senza alcun intervento da parte dell'utente.

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

disinstallazione:

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

Complete proprietario del dispositivo demo app in questo repo.

+0

cosa è createIntentSender qui ..? –

+0

@sandeep controlla la risposta aggiornata – amalBit

+0

Anche ACTION_INSTALL_COMPLETE non è definito! è public static String ACTION_INSTALL_COMPLETE = 'someString' o specifica costante Android? – prototyp

Problemi correlati