我做了比我的问题中描述的更好的解决方法。这仍然是一种解决方法,因为我找不到这种奇怪行为的解释。
我唯一需要的实际上是通知安装失败。我声明了一个继承PackageInstaller.SessionCallback 的类。它看起来像这样:
public class PackageInstallObserver : PackageInstaller.SessionCallback
{
private PackageInstaller PackageInstaller { get; }
public event EventHandler InstallFailed;
public PackageInstallObserver(PackageInstaller packageInstaller) => PackageInstaller = packageInstaller;
public override void OnActiveChanged(int sessionId, bool active) { }
public override void OnBadgingChanged(int sessionId) { }
public override void OnCreated(int sessionId) { }
public override void OnFinished(int sessionId, bool success)
{
PackageInstaller.UnregisterSessionCallback(this);
PackageInstaller.Dispose();
if (!success) InstallFailed?.Invoke(this, EventArgs.Empty);
}
public override void OnProgressChanged(int sessionId, float progress) { }
}
然后在我的InstallPackageAndroidQAndAbove 方法中创建该类的一个实例并将其传递给packageInstaller.RegisterSessionCallback 方法。所以现在InstallPackageAndroidQAndAbove 看起来像这样:
public void InstallPackageAndroidQAndAbove(Android.Net.Uri apkUri)
{
var packageInstaller = PackageManager.PackageInstaller;
var sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
int sessionId = packageInstaller.CreateSession(sessionParams);
var session = packageInstaller.OpenSession(sessionId);
AddApkToInstallSession(apkUri, session);
// Create an install status receiver.
var intent = new Intent(this, this.Class);
intent.SetAction(PACKAGE_INSTALLED_ACTION);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.UpdateCurrent);
var statusReceiver = pendingIntent.IntentSender;
// Create an observer and register it
var observer = new PackageInstallObserver(packageInstaller);
observer.InstallFailed += OnInstallFailed; // Subscribe to event
packageInstaller.RegisterSessionCallback(observer);
// Commit the session (this will start the installation workflow).
session.Commit(statusReceiver);
}