2016-08-19 37 views
0

我试图编码的概念证明,与Xamarin安卓。 一种EMM工具,即负责安装其他应用程序并管理设备的应用程序。 所以安卓棉花糖是一款以android为工作特性的良好开端。Xamarin.Android软件包安装程序Session.commit“文件仍然打开”apk安静安装的例外

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

我把我的代码出色的Android testdpc样品的例子在github here

它在C#中的工作与Xamarin我已经改变了它。

这里是我的代码:

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。

如果有人得到了我的问题任何线索,我会很感激的帮助

回答

0

抛出:SecurityException:如果流打开,通过openWrite(字符串,很久)仍然是开放的。

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

谢谢! 垃圾收集器的这个调用我有点困扰,但因为它工作... – Mathieu