2012-05-16 4 views
12

Из-за this annoying Android limitation Мне нужно, чтобы пользователи переустанавливали мое приложение, чтобы разрешения манифеста были обнаружены другими приложениями.Переустановить приложение apk программно, не загружая

Это уже разочаровывает пользователя, но кроме того, я не вижу способа переустановки моего приложения из 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, это представляет два варианта: установки пакета и Проверка и установка. Я не знаю, если последний будет иметь дело с вопросом:

  • Установка приложение таким образом, вероятно, удалить права собственности на него из Play Маркета

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

  • Заметим, однако, если ваше приложение вперед заблокирован (что неизбежно для всех платных приложений, начиная с JB, из-за шифрования приложения), то это не будет работать becau себе приложение исполняемый файл не доступен для чтения других

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

+1

Возможно, вы сможете скопировать его из/data/app на карту памяти. Хотя вы не можете просматривать этот каталог, файлы, которые он содержит, обычно читабельны, хотя это не гарантировано (и это не всегда место установки). Альтернативой может быть не использование системы разрешений, а попытка выполнить собственную проверку подлинности пакета запроса. –

+0

Спасибо Крис. Мое приложение должно быть установлено на устройстве, иначе оно не будет работать правильно, поэтому у меня есть минимальные заботы о месте установки пользователя. Я предполагаю, что это единственное соображение, о котором вы говорили? Кроме того, поскольку/data/app читается, я мог проверить, что apk находился там до чего-либо еще. Из моего поиска я не могу найти способ перенести apk из этого местоположения, не используя функции root ... Хотелось бы узнать, есть ли способ ... Я не уверен, что вы имели в виду под моей «собственной аутентификацией»? Приветствия. – brandall

+0

Если это доступно для чтения (как обычно), вам не нужен корень, чтобы скопировать его туда, где вам разрешено писать (например, sdcard, с соответствующим разрешением манифеста). Однако/data/app не всегда находится там, где он устанавливается. И иногда имя файла apk изменяется во время установки. Вы можете определить местоположение и установленное имя из /data/system/packages.xml, но в этот момент вы довольно глубоко входите в частные внутренние функции, которые не могут быть в будущем доказательством. На самом деле, повторная загрузка - это, вероятно, ваш лучший выбор - по крайней мере, это вариант как резервный. –

ответ

3

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

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

  • Единственный способ сделать любой вид установки из приложения, чтобы пройти через боковую загрузку UI, который (а) будет очень страшным для пользователя, и (б) потребует, чтобы пользователь включил боковую загрузку, чтобы иметь возможность продолжить.
  • Установка вашего приложения таким образом, вероятно, удалит право собственности на него из Play Маркета (поскольку он уже не тот, который его установил).Это может означать, например, что пользователь больше не может сообщать вам о сбоях или ANR в магазине воспроизведения или других негативных последствиях. Я точно не знаю, какие проблемы на самом деле произойдут здесь, но я действительно не предполагал, что все будет хорошо.

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

+0

Спасибо за ваш ответ. Хорошим примером этой проблемы является приложение Tasker, для которого требуется net.dinglisch.android.tasker.PERMISSION_RUN_TASKS. Как я уверен, вы знаете, что Tasker может внести некоторые важные изменения в устройства, поэтому понятно, почему разработчик хотел бы привлечь внимание пользователя, устанавливающего мое приложение. Если я предлагаю своим пользователям, чтобы они устанавливали Tasker для своих совместимых функций, мне тогда была представлена ​​такая ситуация, когда разрешения в моем манифесте не обнаружены. Я не уверен, могу ли я пометить ваш ответ как «правильный», поскольку не существует решения? – brandall

Смежные вопросы