Установщик пакета Android - как получить Open и Done и результат активности?

В моем приложении для Android есть возможность обновиться до более новой версии, более новой версии APK, которую я храню по пути в SD-карте. При нажатии кнопки «Обновить» я вызываю следующий метод.

    public static void launchInstaller(Activity act, String apkPath)
    {
       Intent intent = new Intent(Intent.ACTION_VIEW);
       intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive");
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       act.startActivityForResult(intent, 0);
    }

Причина, по которой я включаю FLAG_ACTIVITY_NEW_TASK, заключается в том, что после обновления я хочу иметь параметры «Открыть» и «Готово», которые не отображаются, если я не использую этот флаг.

Когда приведенный выше код запускает установщик пакета, у него есть две опции «ОК» и «Отмена», когда пользователь нажимает «Отмена», я хочу знать, что пользователь отменил его. Но я не могу знать, потому что onActivityResult вызывается преждевременно. Я пришел к причине, почему это происходит после прочтения следующих сообщений.

Android - startActivityForResult немедленно запускает onActivityResult

onActivityResult() вызывается преждевременно

Они просят меня убедиться, что для намерения, которое я использую для запуска действия, не установлен флаг FLAG_ACTIVITY_NEW_TASK. Посмотреть здесь:

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

В частности, обратите внимание: «Этот флаг нельзя использовать, когда вызывающая сторона запрашивает результат запускаемой активности».

Если действие запускается как часть новой задачи, Android немедленно вызовет onActivityResult() с RESULT_CANCELED, потому что действие в одной задаче не может возвращать результаты другой задаче, это могут делать только действия в той же задаче.

Но в моем случае я не могу удалить FLAG_ACTIVITY_NEW_TASK, потому что иначе я не получу опции «Открыть» и «Готово» при успешном обновлении.

Кто-нибудь сталкивался с подобной проблемой? Пожалуйста, помогите мне, так как это сводит меня с ума.


person Mukesh Bhojwani    schedule 25.09.2013    source источник
comment
У меня такая же проблема... Вы получили какое-то решение для этого?   -  person Himanshu    schedule 28.10.2014


Ответы (1)


Вы должны использовать пакет, добавленный в широковещательную рассылку. Создайте широковещательный приемник, прослушайте добавлен пакет. Если добавленный пакет равен вашему package, пользователь подтвердит установку, иначе закроет процесс установки. Если вы спросите, какие дополнения могут быть возвращены андроидом, андроид вернет EXTRA_UID о пакете. Метод PackageManager конвертирует uid в package.(getPackagesForUid(int uid) возвращает массив String, но обычно он возвращает один элемент в массиве, обычно длина массива равна 1.

person nurisezgin    schedule 02.10.2013