Переустановите приложение apk программно без скачивания

Из-заэто раздражающее ограничение Android Мне нужно, чтобы пользователи переустановили мое приложение, чтобы разрешения манифеста обнаруживались другими приложениями.

Это уже будет разочаровывать пользователя, но, кроме того, я не вижу способа переустановить свое приложение из apk, хранящегося в / data / app, и поэтому мне пришлось бы загрузить ту же версию на карту памяти перед запуском обычное намерение установки.

Я с нетерпением жду, когда кто-нибудь скажет мне, что я упускаю что-то очевидное! Я нарисовал бланк ...

Заранее спасибо.

Пожалуйста, отметьте проблему, если вы хотите, чтобы она была решена! Приветствия.

EDIT: Имея в виду комментарии @hackbod, вы можете использовать следующий код для запуска диалога установки.

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(this.getApplicationInfo().sourceDir)),
"application/vnd.android.package-archive");
startActivity(intent);

На моем устройстве Jelly Bean это представлено двумя вариантами:Package installer а такжеVerify and install, Я не знаю, будет ли последний заниматься вопросом:

Installing your app this way will probably remove ownership of it from the Play Store

Мое приложение бесплатное, поэтому я не могу проверить платный выпуск:

Note however if your app is forward locked (which is unavoidable for all paid applications starting with JB, due to the app encryption), then this won't work because your app executable is not readable by others

Хотя hackbod заканчивается «читаемыми другими» что говорит о том, что, если вы выполняете это через свой собственный код, для вашего собственного приложения, это читабельно? Пожалуйста, исправьте меня, если вы можете проверить это, и я ошибаюсь.

 brandall16 мая 2012 г., 17:13
Еще раз спасибо, я рассмотрю ваши предложения - я не знал о / proc / self / maps. Если бы я поверил, что Google исправит это через несколько дней, я бы не стал так беспокоиться в промежуточный период - но у меня такое чувство, что я ищу более долгосрочное решение!
 Chris Stratton16 мая 2012 г., 17:01
На самом деле само приложение может определить свой собственный файл / местоположение apk из / proc / self / maps, так как оно само открылось и отображено в памяти в результате работы. Заметьте, я сказал, что само приложение - другой процесс, такой как оболочка adb, будет видеть то, что сопоставлено с его собственным процессом, а не с приложением.
 Chris Stratton16 мая 2012 г., 16:58
Если он читабелен (как обычно), вам не нужен root, чтобы скопировать его туда, куда вам разрешено писать (например, на sdcard, с соответствующим разрешением на манифест). Однако / data / app не всегда там, где он установлен. И иногда имя файла apk изменяется во время установки. Возможно, вы сможете определить местоположение и установленное имя из /data/system/packages.xml, но в этот момент вы достаточно глубоко погрузитесь в частную внутреннюю функциональность, которая может оказаться неоправданной. Действительно, повторная загрузка, вероятно, является вашей лучшей ставкой - по крайней мере, используйте ее как запасной вариант.
 brandall16 мая 2012 г., 16:28
Спасибо, Крис. Моё приложение должно быть установлено на устройстве, иначе оно не будет работать правильно, поэтому я минимально беспокоюсь о месте установки пользователя. Я предполагаю, что это единственное соображение, на которое вы ссылались? Кроме того, так как / data / app является читабельным, я мог проверить, что apk был там, прежде чем что-либо еще. Из моего поиска я не могу найти способ перенести apk из этого места, если не использую корневые функции ... Хотелось бы узнать, есть ли способ ... Я не уверен, что вы имели в виду под моей "собственной аутентификацией". ? Приветствия.
 Chris Stratton16 мая 2012 г., 16:19
Возможно, вы сможете скопировать его из / data / app на карту памяти. Хотя вы не можете просматривать этот каталог, обычно содержащиеся в нем файлы читабельны, хотя это не гарантировано (и в любом случае это не всегда место установки). Альтернативой может быть не использовать систему разрешений, а попытаться выполнить собственную аутентификацию запрашивающего пакета.

Ответы на вопрос(1)

Возможно, вы могли бы просто получить путь к вашему .apk через Context.getApplicationInfo (). SourceDir и запустить установщик приложения с этим путем. Однако, если ваше приложение заблокировано для пересылки (что неизбежно для всех платных приложений, начиная с JB, из-за шифрования приложения), то это не сработает, поскольку исполняемый файл вашего приложения не читается другими. В этом случае вам нужно будет скопировать .apk куда-нибудь в читаемый мир (например, во внешнее хранилище) и установить его оттуда.

Независимо от того, что вы делаете здесь, однако, это имеет некоторые неизбежные очень негативные последствия:

The only way to do any kind of install from your app is to go through the side-loading UI, which is (a) going to be a very scary experience for the user, and (b) will require that the user turn on side-loading to be able to proceed. Installing your app this way will probably remove ownership of it from the Play Store (since it is no longer the one that has installed it). This may mean for example that the user can no longer report crashes or ANRs to you through the play store, or other negative consequences. I am not sure exactly what problems will actually happen here, but I really wouldn't assume that this is going to be okay.

В конечном счете, я бы очень не советовал делать это. Какое разрешение вам нужно, что заставляет вас делать это? По многим причинам я бы не рекомендовал сторонним приложениям объявлять свои собственные разрешения в большинстве случаев, потому что существует много плохого пользовательского опыта, связанного с разрешениями, которые известны только после того, как они могут понадобиться.

 brandall30 авг. 2012 г., 15:21
Спасибо за Ваш ответ. Хорошим примером этой проблемы является приложение Tasker, для которого требуется net.dinglisch.android.tasker.PERMISSION_RUN_TASKS. Как я уверен, вы знаете, что Tasker может внести некоторые существенные изменения в устройство, поэтому понятно, почему разработчик хотел бы довести это до сведения пользователя, устанавливающего мое приложение. Если я предлагаю своим пользователям установить Tasker для его совместимых функций, я затем сталкиваюсь с такой ситуацией, когда разрешения в моем манифесте не обнаруживаются. Я не уверен, смогу ли я пометить ваш ответ как "правильный" как там не похоже решение проблемы?

Ваш ответ на вопрос