Как получить статус при использовании Android PackageInstaller? - PullRequest
0 голосов
/ 15 октября 2019

Я использую следующий код для установки 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());

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

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

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

...