Как получить статус при использовании Android PackageInstaller?

Изменить: я добавил решение для уровня API 29 или более поздней версии. Однако это не решает мою проблему.

Я был бы признателен, если бы кто-нибудь придумал метод для уровня API 28 или ранее.

Оригинальный вопрос:

Я использую следующий код для установки apks:

final int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
OutputStream out = session.openWrite("COSU", 0, -1);
FileInputStream in = new FileInputStream(apkPath);
byte[] buffer = new byte[4*1024];
int c;
while ((c = in.read(buffer)) != -1) {
    out.write(buffer, 0, c);
}
session.fsync(out);
in.close();
out.close();

packageInstaller.registerSessionCallback(new PackageInstaller.SessionCallback() {
    @Override
    public void onCreated(int sessionid) {
        Log.i(TAG, "onCreated: installer created");
    }

    // ... other handlers

    @Override
    public void onFinished(int sessionid, boolean success) {
        if(sessionid != sessionId)
            return;

        if(success)
        {
            Log.i(TAG, "onFinished: installation successfull");
        }
        else
        {
            Log.i(TAG, "onFinished: installation failed");
        }
    }
});

session.commit(PendingIntent.getBroadcast( common.appContext, sessionId,
        new Intent("android.intent.action.MAIN"), 0).getIntentSender());

Он работает так, как я ожидал. Тем не менее, я хочу получить причину, по которой это не удалось, когда это произошло.

Параметр «успех» в обработчике onFinished является просто логическим значением и мало что говорит. Прочитав документацию, я понял, что существуют коды состояния, которые можно используется для этого (например, STATUS_FAILURE_STORAGE, STATUS_FAILURE_INCOMPATIBLE...), но я не смог найти документацию или пример, показывающий, как получить код состояния в случае сбоя.

Примечание. Это работает без пользовательского интерфейса, поэтому я не могу использовать примеры с видимыми действиями.


person t.m.    schedule 15.10.2019    source источник
comment
У меня такая же проблема. Вы когда-нибудь придумывали, как получить лучший код ошибки?   -  person Bungles    schedule 20.04.2020
comment
Нет. Но, как я уже сказал, msg.arg2 в PackageInstaller — это код ошибки, 0 — успех. Если вы согласны с изменением кода Android в своем проекте, вы можете изменить регистр MSG_SESSION_FINISHED, чтобы отправить этот код ошибки.   -  person t.m.    schedule 20.04.2020
comment
Вы пробовали с onNewIntent? stackoverflow.com/questions/62550539/   -  person AndroMen    schedule 28.08.2020
comment
Спасибо, но, как я уже сказал, я не могу использовать примеры с видимыми действиями. Мне нужно установить обновления без взаимодействия с пользователем.   -  person t.m.    schedule 28.08.2020


Ответы (1)


Для уровня API 29 getStagedSessionErrorCode() и Добавлены функции getStagedSessionErrorMessage(). Итак, вы можете сделать что-то вроде:

Log.e(TAG, packageInstaller.getSessionInfo(installerSessionId).getStagedSessionErrorMessage());
person t.m.    schedule 02.12.2020