Как отправлять обновления в предустановленные приложения, не разрешая установку из неизвестных источников

У меня есть несколько Android-устройств, которые нужно прошить пользовательскими прошивками и раздать клиентам. Частью этого ПЗУ будет приложение «поддержка», привязанное к устройству. Его нельзя опубликовать в Google Play. Мне нужно иметь возможность предлагать пользователям возможность загружать и устанавливать обновленные версии программного обеспечения. У меня уже реализован код проверки, загрузки и установки, однако он зависит от устройств, настроенных для установки приложений из неизвестных источников. Мне нужно, чтобы устройство могло загружать и устанавливать этот конкретный apk, но при этом не позволяло устанавливать какие-либо другие приложения из неизвестных источников.

Это возможно?

(изменить: чтобы уточнить, как выбранный ответ наконец сработал)

Код, добавленный к активности, был следующим:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() +"/update.apk")), "application/vnd.android.package-archive");
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
intent.putExtra(Intent.EXTRA_ALLOW_REPLACE, true);

startActivityForResult(intent, 0);

В манифест андроида был добавлен следующий код:

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

После установки приложения я использовал проводник корневых файлов, чтобы переместить apk с /user/apps на /system/apps, затем после перезагрузки телефона приложение смогло установить себя поверх самого себя, без запроса пользователю на включение ненадежных источников. Запрос на установку, в котором перечислены разрешения, необходимые приложению, и дающий пользователю возможность установить или не устанавливать, все еще появляется, но это нормально.


person LairdPleng    schedule 04.09.2012    source источник


Ответы (1)


Этот метод работает только для системных приложений (источник).

Попробуйте установить apk, добавив дополнительное поле.

intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);

Никогда не пробовал это. В документе говорится, что для этого вам нужно вызвать startActivityforResult. Но для этого требуется уровень API 14. Также попробуйте

intent.putExtra(Intent.EXTRA_ALLOW_REPLACE, true);

Изменить: Если подумать, если у вас есть пользовательское ПЗУ, добавьте систему с общими идентификаторами в приложение-установщик и напрямую вызовите все, что PackageInstallerActivity вызывает для установки приложения.

Редактировать2:

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

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

разрешение.

И в Android.mk приложения добавить

 LOCAL_CERTIFICATE := platform
person nandeesh    schedule 04.09.2012
comment
Всем привет. Я попытался добавить дополнительные поля, и они все еще не отменяют безопасность. Не могли бы вы рассказать мне больше о методе shareduserid, пожалуйста? - person LairdPleng; 04.09.2012
comment
Привет, спасибо за ваш ответ, но если вы проверите комментарии в этом коде, это не отменяет необходимость включения неизвестных источников, а просто предложит им изменить настройку. - person LairdPleng; 05.09.2012
comment
Затем вы всегда можете вызвать API менеджера пакетов, который устанавливает приложение pm.installPackage(mPackageURI,Observer, installFlags, installerPackageName); . - person nandeesh; 05.09.2012
comment
Мне удалось разобраться с этим, используя метод, который вы ранее опубликовали. Мне нужно было переместить систему/приложения приложений из пользователя/приложений, и это сработало отлично. Благодарность - person LairdPleng; 05.09.2012