簡體   English   中英

Xamarin.Android PackageInstaller Session.commit apk靜默安裝上的“文件仍打開”異常

[英]Xamarin.Android PackageInstaller Session.commit “Files still open” Exception on apk silent install

我正在嘗試使用Xamarin android編寫概念證明。 一種EMM工具,即一個負責安裝其他應用程序和管理設備的應用程序。 因此, Android Marshmallow是android具有良好工作功能的良好開端。

我的應用程序是設備所有者,因此以靜默方式安裝其他應用程序應該沒有問題。 它可以毫無問題地從網站下載apk。 但是,當我嘗試安裝它時,盡管調用了所有Close()方法,它仍會引發“ 文件仍處於打開狀態 ”異常。

我把我的代碼出色的Android testdpc樣品的例子在github 這里

我已經更改了它,因為它可以在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM