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

У меня есть куча устройств 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);

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

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

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

1 ответ

Решение

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

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

intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);

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

intent.putExtra(Intent.EXTRA_ALLOW_REPLACE, true);

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

Edit2:

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

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

разрешение.

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

 LOCAL_CERTIFICATE := platform
Другие вопросы по тегам