Могу ли я обновить приложение для Android с помощью кнопки обновления?

Мы создали приложение для Android. Это нерыночное приложение, которое развертывается для множества клиентов. С помощью MobiControl мы рассылаем новые обновления для нашего приложения. Обновление происходит молча.

Во время обновления, если приложение используется и пользователь вводит какие-либо данные, приложение закрывается, не дожидаясь подтверждения пользователя!!, пользователь обновляется до более новой версии приложения и повторно запускает его. Из-за этого пользователь теряет свои изменения!! Кроме того, поскольку наше приложение имеет дело с конфиденциальной информацией, мы никогда не сможем записать ее в физическое хранилище устройства. Следовательно, «сохранить и восстановить» не вариант.

Одна идея, которую я подумал, может заключаться в том, чтобы предоставить кнопку «Обновить» на одном из экранов моего приложения (скажем, в настройках), откуда я мог бы обновить его до более новой версии. Для этого я получил следующий код, с помощью которого я могу показать намерение установки после передачи APK в качестве параметра.

Intent promptInstall = new Intent(Intent.ACTION_VIEW)
    .setData(Uri.parse("file:///path/to/myapp.apk"))
    .setType("application/vnd.android.package-archive");
startActivity(promptInstall); 

Но когда приведенный выше код выполняется, я сталкиваюсь со следующей ошибкой.

06-21 18:29:01.666: E/AndroidRuntime(8981): Caused by: android.content.ActivityNotFoundException: 
No Activity found to handle Intent { act=android.intent.action.VIEW typ=application/vnd.android.package-archive }

Это сработало вчера, когда я вызвал setDataAndType одной строкой. Но сегодня с тем же кодом я снова столкнулся с той же проблемой...

06-25 10:27:39.383: E/AndroidRuntime(3737): Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/test/ReinstallSample.apk typ=application/vnd.android.package-archive }
06-25 10:27:39.383: E/AndroidRuntime(3737):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622)
06-25 10:27:39.383: E/AndroidRuntime(3737):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
06-25 10:27:39.383: E/AndroidRuntime(3737):     at android.app.Activity.startActivityForResult(Activity.java:3370)
06-25 10:27:39.383: E/AndroidRuntime(3737):     at android.app.Activity.startActivityForResult(Activity.java:3331)
06-25 10:27:39.383: E/AndroidRuntime(3737):     at android.app.Activity.startActivity(Activity.java:3566)
06-25 10:27:39.383: E/AndroidRuntime(3737):     at android.app.Activity.startActivity(Activity.java:3534)
06-25 10:27:39.383: E/AndroidRuntime(3737):     at com.example.reinstallsample.MainActivity.launchInstaller(MainActivity.java:73)
06-25 10:27:39.383: E/AndroidRuntime(3737):     at com.example.reinstallsample.MainActivity.reInstall(MainActivity.java:66)
06-25 10:27:39.383: E/AndroidRuntime(3737):     ... 14 more

person Mukesh Bhojwani    schedule 21.06.2013    source источник
comment
Похоже, что действия, которое вы вызываете, нет в AndroidManifest. вы проверили?   -  person    schedule 21.06.2013


Ответы (1)


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

Intent promptInstall = new Intent(Intent.ACTION_VIEW);
promptInstall.setDataAndType(Uri.parse(filePath), "application/vnd.android.package-archive");
startActivity(promptInstall);
person Chor Wai Chun    schedule 21.06.2013
comment
Спасибо!! с этим единственным вызовом он работает нормально. Единственное, после переустановки он закрывает диалоговое окно установщика, так что знаете ли вы какую-либо конфигурацию, с которой он не закрывается, а показывает опции «Открыть», «Отмена». - person Mukesh Bhojwani; 24.06.2013
comment
Извините, но я не знаю, это было то, что я сделал тогда на стадии тестирования, не изучил его очень много, так как в конце мой проект будет опубликован в Play Store, и это, кажется, запрещено. - person Chor Wai Chun; 24.06.2013