Xamarin.Android PackageInstaller Session.commit“文件仍然打开”apk静默安装异常

Posted

技术标签:

【中文标题】Xamarin.Android PackageInstaller Session.commit“文件仍然打开”apk静默安装异常【英文标题】:Xamarin.Android PackageInstaller Session.commit "Files still open" Exception on apk silent install 【发布时间】:2016-12-26 08:06:23 【问题描述】:

我正在尝试使用 Xamarin android 编写概念证明。 一种 EMM 工具,即负责安装其他应用程序和管理设备的应用程序。 所以 Android Marshmallow 是开始使用 android for work 功能的好地方。

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

我的代码来自优秀的 android-testdpc github 示例 here。

我已将其更改为使用 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。

如果有人对我的问题有任何线索,我将不胜感激。

【问题讨论】:

FWIW - 我在这里添加了一个工作的,虽然是简单的 Xamarin 翻译 - ***.com/a/69774124/1399272 【参考方案1】:

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 版本 Q 10 时停止工作。然后此代码导致错误消息“写入失败:EBADF (Bad file descriptor)”

以上是关于Xamarin.Android PackageInstaller Session.commit“文件仍然打开”apk静默安装异常的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 是 Xamarin.Android、Xamarin.IoS 和 Xamarin.Win 的简单总和吗?

xamarin android开发 两个按钮 怎么放在同一排上

抽屉布局在 Xamarin.Android.Support.Core.UI 和 Xamarin.Android.Support.V4 中都存在

无法使用 Xamarin.Android 中的 Xamarin.Mobile 组件保存联系人

将Xamarin.Android应用程序迁移到Xamarin.Forms应用程序

dotnet 5 和 Xamarin Android:找不到导入的项目“Xamarin.Android.CSharp.targets”