Android программно обновляет apk и видит результат установки
Я пишу приложение для обновления приложения. После того, как я убедился, что у меня есть apk на устройстве, это то, что я делаю в приложении, которое я пытаюсь обновить:
Intent promptInstall = new Intent(Intent.ACTION_VIEW);
File f = new File(apkLocation);
promptInstall.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive");
_context.startActivity(promptInstall);
Это запускает мой установщик, который отображает разрешения приложений, и я могу нажать "Установить". Но отсюда приложение просто закрывается, я не получаю никакого сообщения (я бы ожидал, что диалог говорит мне, что установка прошла успешно, давая мне возможность нажать "Закрыть" или "Открыть" ). Он просто переходит на главный экран устройства без дополнительного уведомления.
С другой стороны, приложение действительно обновляется, когда я вручную открываю его.
Как я могу заставить установщика пройти весь путь, как ожидалось? Есть ли что-то, что нужно для намерения?
Во время написания этого вопроса мне интересно, может ли причина, по которой это происходит, заключается в том, что текущее приложение просто перезаписывается на устройстве, тем самым закрывая его, и по мере того, как не получается результат намерения, потому что его источник был убит?
Ответы
Ответ 1
Все, что вы можете сделать, это зарегистрировать приемник с фильтрами намерений, такими как android.intent.action.PACKAGE_INSTALL
или android.intent.action.PACKAGE_REPLACED
, из которого вы можете снова перезапустить приложение.
<receiver android:enabled="true" android:exported="true" android:label="BootService" android:name="com.project.services.BootService">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<data android:scheme="package"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<data android:scheme="package"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_INSTALL"/>
<data android:scheme="package"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_CHANGED"/>
<data android:scheme="package"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
</application>
И
public class BootService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
Intent serviceIntent = new Intent();
serviceIntent.setClass(context,Controller.class);
serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(serviceIntent);
} else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
Intent serviceIntent = new Intent();
serviceIntent.setClass(context, Controller.class);
serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(serviceIntent);
}
}
}
Ответ 2
Для успешного обновления вам необходимо запустить намерение с помощью URI, указывающее на ваше приложение для обновления как новую задачу.
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK));
"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Мой пост ниже:
Проблема обновления приложений для Android
Ответ 3
Во-первых, вы не можете установить без подсказки, если только вы не внедрены или не имеете системных привилегий. Я не думаю, что вы спрашивали об этом, но один из ваших абзацев не ясен.
Во-вторых, при установке версии обновления запущенного приложения ожидается поведение, которое вы видите: приложение закрыто и обновлено. Вы не можете обновить его на месте. Вы можете обнаружить, когда установка была прервана, потому что действие, вызывающее установщик, будет возобновлено.
Чтобы обновить запущенное приложение и сохранить его, вам понадобится отдельный процесс (приложение) для мониторинга установки и перезапуска приложения.