首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >apk静默安装上的Xamarin.Android PackageInstaller Session.commit "Files仍打开“异常

apk静默安装上的Xamarin.Android PackageInstaller Session.commit "Files仍打开“异常
EN

Stack Overflow用户
提问于 2016-08-19 08:22:29
回答 1查看 2.2K关注 0票数 4

我试图用Xamarin android编写一个概念的证明。一种EMM工具,即负责安装其他应用程序和管理设备的应用程序。因此,Android 是一个很好的地方,可以从安卓的工作特性开始。

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

我从优秀的android示例这里中获得了我的代码。

我已经将它改为在C#中与Xamarin一起工作。

这是我的代码:

代码语言:javascript
复制
    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并用Java测试我的代码,看看问题是否来自Xamarin。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-19 18:48:53

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

Java对象尚未关闭,这是我为PackageInstaller.Session.Commit强制使用的方法

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39034348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档