示例#1
0
        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;
        }