Android PackageInstaller не устанавливает APK - PullRequest
2 голосов
/ 10 января 2020

Привет, пользователи StackOverflow,

У меня есть приложение Android за пределами Play Store. Он обновляет себя, загружая новый APK и вызывая диалоговое окно установщика с помощью Intent. Функциональность обновления больше не работает на Android 10.

Мне нужно использовать API PackageInstaller на Android 10 сейчас, но я не могу заставить его работать. Мое приложение не является владельцем устройства или профиля, но поскольку я не хочу установку без вывода сообщений, поэтому я думаю, что все должно быть в порядке.

Моя проблема в том, что как только я фиксирую сеанс, абсолютно ничего не происходит.

PackageInstaller installer = activity.PackageManager.PackageInstaller;
PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
int sessionId = installer.CreateSession(sessionParams);
PackageInstaller.Session session = installer.OpenSession(sessionId);

var input = new FileStream(pfad, FileMode.Open, FileAccess.Read);
var packageInSession = session.OpenWrite("package", 0, -1);
input.CopyTo(packageInSession);
packageInSession.Close();
input.Close();

//That this is necessary could be a Xamarin bug.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

Intent intent = new Intent(activity, activity.Class);
intent.SetAction("com.example.android.apis.content.SESSION_API_PACKAGE_INSTALLED");
PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.IntentSender;

// Commit the session (this will start the installation workflow).
session.Commit(statusReceiver);

Я взглянул на DDMS и не нашел в этом ничего важного. Одна вещь, которая может быть интересна, это то, что когда я Dispose() потоки, я получаю IOException: write failed (EBADF) bad file descriptor, что указывает на плохой APK. Но я сомневаюсь, что это потому, что я могу установить APK с помощью файлового менеджера без проблем. Погуглив ошибку, никуда меня не привело.

Как я могу решить эту проблему?

...