Установите обновленный APK на Android 10 устройств и поместите то же приложение на передний план - PullRequest
0 голосов
/ 10 февраля 2020

В моем приложении я реализовал процесс обновления, при котором, если доступна новая версия, он автоматически загружает с моего сервера новый apk, а затем пытается установить его. Я заметил, что для Android 10 устройств мне нужно использовать PackageInstaller API (Android 10 - не найдена активность для обработки намерения ): при этом мое приложение правильно запускает процесс установки.

Вот код, который я использовал:

    try{
        String apkPackageName = BuildConfig.APPLICATION_ID;
        PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        params.setAppPackageName(apkPackageName);
        int sessionId = packageInstaller.createSession(params);
        packageInstaller.registerSessionCallback(new InstallationSessionCallback());
        PackageInstaller.Session session = packageInstaller.openSession(sessionId);
        OutputStream outputStream = session.openWrite(apkPackageName, 0, -1);
        byte[] buffer = new byte[16384];
        int n;
        while ((n = inputStream.read(buffer)) >= 0) {
            outputStream.write(buffer, 0, n);
        }
        session.fsync(os);
        inputStream.close();
        outputStream.close();
        Intent intent = new Intent(context, MainActivity.class);
        intent.setAction("myPackage.ANDROID10_INSTALLATION");
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        IntentSender statusReceiver = pendingIntent.getIntentSender();
        session.commit(statusReceiver);
        session.close();
    }
    catch(Exception e){
        Log.e(LOGTAG, e.toString());
    }

обратный вызов onNewIntent:

@Override
protected void onNewIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    String action = "myPackage.ANDROID10_INSTALLATION";
    String intentAction = intent.getAction();
    if (action.equals(intent.getAction())) {
        int status = extras.getInt(PackageInstaller.EXTRA_STATUS);
        String message = extras.getString(PackageInstaller.EXTRA_STATUS_MESSAGE);
        switch (status) {
            case PackageInstaller.STATUS_PENDING_USER_ACTION:
                Intent confirmIntent = (Intent) extras.get(Intent.EXTRA_INTENT);
                startActivity(confirmIntent);
                break;
            case PackageInstaller.STATUS_SUCCESS:
                Toast.makeText(this, "Install succeeded!", Toast.LENGTH_SHORT).show();
                break;
            case PackageInstaller.STATUS_FAILURE:
            case PackageInstaller.STATUS_FAILURE_ABORTED:
            case PackageInstaller.STATUS_FAILURE_BLOCKED:
            case PackageInstaller.STATUS_FAILURE_CONFLICT:
            case PackageInstaller.STATUS_FAILURE_INCOMPATIBLE:
            case PackageInstaller.STATUS_FAILURE_INVALID:
            case PackageInstaller.STATUS_FAILURE_STORAGE:
                Toast.makeText(this, "Install failed! " + status + ", " + message,
                        Toast.LENGTH_SHORT).show();
                break;
            default:
                Toast.makeText(this, "Unrecognized status received from installer: " + status,
                        Toast.LENGTH_SHORT).show();
        }
    }
}

Что я хочу сделать, это поставить свое приложение на передний план после завершения процесса установки. Теперь я не могу добиться такого поведения, потому что после процесса установки мое приложение исчезает (оно переходит в фоновый режим).

Кроме того, в обратном вызове onNewIntent случай PackageInstaller.STATUS_SUCCESS никогда не достигается.

Есть ли способ получить то, что мне нужно?

Я имею в виду, я просто хочу показать тот же диалог, который появляется в стандартной установке apk: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...