gpt4 book ai didi

c# - Xamarin.Android PackageInstaller Session.commit "Files still open"apk 静默安装异常

转载 作者:搜寻专家 更新时间:2023-11-01 08:33:12 25 4
gpt4 key购买 nike

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

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

我的代码来自优秀的 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。

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

最佳答案

SecurityException : if streams opened through openWrite(String, long, long) are still open.

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);

关于c# - Xamarin.Android PackageInstaller Session.commit "Files still open"apk 静默安装异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39034348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com