Как отправить обновления в предустановленные приложения, не допуская установки из неизвестных источников
У меня есть куча устройств 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