private void InstallSilently(Context context, Android.Net.Uri apkUri) { try { Log.Debug("TESTPUSHLINK", "Init Silent Install. apkUri is " + apkUri.Path + " apkUri host is " + apkUri.Host); var inputStream = new FileInputStream(new File(context.FilesDir, apkUri.Path)); var packageInstaller = context.PackageManager.PackageInstaller; var installParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall); installParams.SetAppPackageName(context.PackageName); var sessionId = packageInstaller.CreateSession(installParams); var session = packageInstaller.OpenSession(sessionId); var outStream = session.OpenWrite("COSU", 0, -1); var buffer = new byte[65536]; int c; // HERE THIS LOOP HANGS FOREVER while ((c = inputStream.Read(buffer)) != -1) { outStream.Write(buffer, 0, c); // Log.Debug("PUSHLINK", "writing.."); } // NEVER COMES OUT Log.Debug("TESTPUSHLINK", "Silent Install DONE!! "); session.Fsync(outStream); inputStream.Close(); outStream.Close(); var pendingIntent = PendingIntent.GetBroadcast(context, sessionId, new Intent("dummy.intent.not.used"), 0); session.Commit(pendingIntent.IntentSender); } catch (IOException e) { Log.Error("TESTPUSHLINK", "Silent Install failed to silent -r install. EX: " + e.GetStackTrace()); throw new RuntimeException(e); } catch (Exception e) { Log.Error("TESTPUSHLINK", "Silent Install failed to silent -r install. EX: " + e.StackTrace); } }
async void OnUpdateButtonClicked(object sender, EventArgs args) { // path to the APK to be installed. This could be something downloaded, or it could a file on the SD card. const string localPath = "/storage/emulated/0/Download/test/HelloWorld_v1.0_apkpure.com.apk"; // the following code was largely inspired from // here: https://github.com/nagamanojv/android-kiosk-example/blob/master/KioskExample/app/src/main/java/com/sureshjoshi/android/kioskexample/MainActivity.java. // here: https://forums.xamarin.com/discussion/73589/does-anyone-try-to-install-package-with-packageinstaller-i-get-files-still-open-exception // here: https://forums.xamarin.com/discussion/170925/xamarin-android-10-how-to-install-3rd-party-apk //instantiate a package installer and its parameters. PackageInstaller installer = Android.App.Application.Context.PackageManager.PackageInstaller; PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall); int sessionId = installer.CreateSession(sessionParams); PackageInstaller.Session session = installer.OpenSession(sessionId); using (var input = new FileStream(localPath, FileMode.Open, FileAccess.Read)) { using (var packageInSession = session.OpenWrite("package", 0, -1)) { input.CopyTo(packageInSession); } } //That this is necessary could be a Xamarin bug. GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); PendingIntent pendingIntent = PendingIntent.GetBroadcast(Android.App.Application.Context, sessionId, new Intent("ANY_UNIQUE_NAME_WILL_DO"), 0); session.Commit(pendingIntent.IntentSender); return; }