В моем приложении я реализовал процесс обновления, при котором, если доступна новая версия, он автоматически загружает с моего сервера новый 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: