C# Android PackageInstaller Session.commit“;“文件仍处于打开状态”;apk静默安装异常

C# Android PackageInstaller Session.commit“;“文件仍处于打开状态”;apk静默安装异常,c#,android,xamarin,xamarin.android,android-install-apk,C#,Android,Xamarin,Xamarin.android,Android Install Apk,我正试图用Xamarin android编写一个概念证明。 一种EMM工具,即负责安装其他应用程序和管理设备的应用程序。 因此,Android棉花糖是Android for work功能的良好开端 我的应用程序是设备所有者,因此以静默方式安装其他应用程序应该没有问题。它可以毫无问题地从网站下载apk。但是,当我尝试安装它时,它抛出了一个“文件仍然打开”异常,尽管调用了所有Close()方法 我的代码取自github上优秀的android testdpc示例 我和Xamarin一起在c#工作时改变

我正试图用Xamarin android编写一个概念证明。 一种EMM工具,即负责安装其他应用程序和管理设备的应用程序。 因此,Android棉花糖是Android for work功能的良好开端

我的应用程序是设备所有者,因此以静默方式安装其他应用程序应该没有问题。它可以毫无问题地从网站下载apk。但是,当我尝试安装它时,它抛出了一个“文件仍然打开”异常,尽管调用了所有
Close()
方法

我的代码取自github上优秀的android testdpc示例

我和Xamarin一起在c#工作时改变了它

这是我的密码:

    public static bool InstallPackage(Context context, Handler handler, InputStream input, String packageName)
    {
        try
        {
            PackageInstaller packageInstaller = context.PackageManager.PackageInstaller;
            PackageInstaller.SessionParams param = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
            param.SetAppPackageName(packageName);
            // set params
            int sessionId = packageInstaller.CreateSession(param);
            PackageInstaller.Session session = packageInstaller.OpenSession(sessionId);
            using (System.IO.Stream output = session.OpenWrite("COSU", 0, -1))
            {
                byte[] buffer = new byte[65536];
                int c;
                while ((c = input.Read(buffer)) != -1)
                {
                    output.Write(buffer, 0, c);
                }
                session.Fsync(output);
                input.Close();
                output.Close();
            }
            session.Commit(createIntentSender(context, sessionId)); // this line throws exception 'Files stil open'
            return true;
        }
        catch (Exception ex)
        {
            Log.Error(TAG, "Error installing package: " + packageName, ex);
            handler.SendMessage(handler.ObtainMessage(Common.MSG_INSTALL_FAIL,
                    packageName));
            return false;
        }
    }
我暂时还不能解决这个问题。如果我有时间,我会尝试安装android studio并用java测试我的代码,看看问题是否来自Xamarin

如果有人对我的问题有任何线索,我将非常感谢你的帮助

SecurityException:如果通过openWrite打开的流(String、long、long)仍然打开

Java对等对象尚未关闭,这是我为
PackageInstaller.Session.Commit强制它的方式:

var input = Assets.Open(packageName);
var packageInstaller = PackageManager.PackageInstaller;
var sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
sessionParams.SetAppPackageName(packageName);
int sessionId = packageInstaller.CreateSession(sessionParams);
var session = packageInstaller.OpenSession(sessionId);
using (var output = session.OpenWrite(packageName, 0, -1))
{
    input.CopyTo(output);
    session.Fsync(output);
    foreach (var name in session.GetNames())
        Log.Debug("Installer", name);
    output.Close();
    output.Dispose();
    input.Close();
    input.Dispose();
    GC.Collect();
}
var pendingIntent = PendingIntent.GetBroadcast(BaseContext, sessionId, new Intent(Intent.ActionInstallPackage), 0);
session.Commit(pendingIntent.IntentSender);

谢谢我对垃圾收集器的这个调用感到有点不安,但因为它可以工作……不幸的是,当使用android sdk版本Q10时,它停止了工作。然后,此代码导致错误消息“写入失败:EBADF(错误的文件描述符)”