Я не знаю, что означает «динамический загрузчик, зависящий от текущей среды пользователя». Ответ, предоставленный @Lie Ryan, показывает, как вы можете установить APK, загруженный любым удобным для вас способом.
CommonsWare
Ответы:
241
Вы можете легко запустить ссылку на магазин Play Play или приглашение к установке:
Хороший ответ, но не используйте /sdcardжесткий код, поскольку это неправильно на Android 2.2+ и других устройствах. Используйте Environment.getExternalStorageDirectory()вместо этого.
CommonsWare
3
Каталог / asset / существует только на компьютере разработчика, когда приложение компилируется в APK, каталог / asset / больше не существует, так как все ресурсы находятся внутри APK. Если вы хотите установить из своего каталога / asset /, сначала вам нужно извлечь его в другую папку.
Ли Райан
2
@LieRyan. Приятно видеть ваш ответ. У меня рутованное устройство с кастомным ПЗУ. Я хочу установить темы динамически, не прося пользователя нажать кнопку «Установить». Могу ли я сделать это.
Sharanabasu Angadi
1
Кажется, это больше не работает, когда targetSdk равен 25. Это дает исключение: «android.os.FileUriExposedException: ... apk, доступный за пределами приложения через Intent.getData () ...». Как придешь?
разработчик Android
4
@android developer: в данный момент я не могу проверить это, но для targetSdkVersion> = 24 применимо следующее: stackoverflow.com/questions/38200282/… так что вам нужно использовать FileProvider.
У меня была такая же проблема, и после нескольких попыток у меня все получилось. Я не знаю почему, но установка данных и типа по отдельности провалила мои намерения.
Я не могу высказать этот ответ достаточно. По какой-то причине установка данных намерения и типа MIME по отдельности вызывает исключение ActivityNotFoundException на уровне API 17
Брент М. Заклинание,
Я только что проголосовал за это тоже. Эта форма была единственной чертовой, которую я мог получить на работу. Еще годы спустя .. что это за чёртова ошибка? Часы потрачены впустую. Я использую Затмение (Гелиос), кстати.
Там
10
@ BrentM.Spell и другие: загляните в документацию, вы увидите, что всякий раз, когда вы устанавливаете только тип данных OR, другой автоматически аннулируется, например setData(), вызывает удаление параметра типа. Вы ДОЛЖНЫ использовать, setDataAndType()если хотите дать значения для обоих. Здесь: developer.android.com/reference/android/content/…
Богдан Александру
41
Решения, предоставленные на этот вопрос, все применимы к targetSdkVersionс 23 и ниже. Однако для Android N, то есть уровня API 24 и выше, они не работают и аварийно завершают работу со следующим исключением:
android.os.FileUriExposedException: file:///storage/emulated/0/... exposed beyond app through Intent.getData()
Это связано с тем, что, начиная с Android 24, Uriизменился адрес для загруженного файла. Например, установочный файл с именем, appName.apkхранящимся в основной внешней файловой системе приложения с именем пакета, com.example.testбудет иметь вид
Это pathNameто, что показано в приведенном выше примере содержимого и pathValueявляется фактическим путем в системе. Было бы неплохо поставить "." (без кавычек) для pathValue в приведенном выше, если вы не хотите добавлять какие-либо дополнительные подкаталоги.
Напишите следующий код для установки apk с именем appName.apkв основной внешней файловой системе:
Я следовал этому методу. Тем не менее, он говорит, что файл поврежден, когда я нажимаю кнопку установки. Я могу установить тот же файл, передав через Bluetooth. почему так?
HI. Когда вы получаете сообщение о повреждении файла, какой способ передачи вы использовали для своего приложения, чтобы принести APK, если вы загружаете с сервера, установите флажок для очистки потоков при копировании файла с сервера? Поскольку установка APK, который был передан по Bluetooth, означает, что это проблема, я думаю.
Шридхар С
2
java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData (android.content.pm.PackageManager, java.lang.String)' для ссылки на пустой объект
Маквин
Ваша библиотека может, наконец, иметь простой readme с простыми инструкциями по использованию ...;)
Renetik
2
Огромное спасибо, после недели борьбы с этим ответом я решил свою проблему! @ SridharS, я знаю, что это было давно, как я вижу, но если вам интересно, в строке 5, вы должны добавить .authorityStrпосле, context.getPackageName()это должно работать.
сехроб
30
Ну, я покопался глубже и нашел источники приложения PackageInstaller из Android Source.
android.permission.INSTALL_PACKAGES доступен только для приложений, подписанных системой. Так что это не сильно поможет
Хьюберт Либерацкий
21
Я просто хочу поделиться тем фактом, что мой apk-файл был сохранен в директории «Data» моего приложения и что мне нужно было изменить разрешения для apk-файла, чтобы они были доступны для чтения всем пользователям, чтобы разрешить его установку таким образом, в противном случае система выдает «Ошибка синтаксического анализа: существует проблема с анализом пакета»; так что используя решение @Horaceman, которое делает:
Третье: определите path.xml в папке res / xml, как показано ниже! Я использую этот путь для внутреннего хранения, если вы хотите изменить его на что-то еще, есть несколько способов! Вы можете перейти по этой ссылке:
FileProvider
Позволяет приложению запрашивать установку пакетов. Приложения с таргетингом на API более 25 должны иметь это разрешение для использования Intent.ACTION_INSTALL_PACKAGE.
Пожалуйста, убедитесь, что полномочия провайдера одинаковы!
Спасибо, четвертый шаг был тем, чего не хватало во всех из них.
Амин Кешаварзян
1
Действительно, 4-й пункт абсолютно необходим. Все остальные ответы полностью пропустили.
белоголовый
Разве android.permission.REQUEST_INSTALL_PACKAGES не доступен только системным приложениям или приложениям, подписанным с системным хранилищем ключей или чем-то еще?
pavi2410
@Pavitra Позволяет приложению запрашивать установку пакетов. Приложения с таргетингом на API более 25 должны иметь это разрешение для использования Intent.ACTION_INSTALL_PACKAGE. Уровень защиты: подпись
Hadi Note
Этот код не использует Intent.ACTION_INSTALL_PACKAGE. Так почему это разрешение ??
Александр Дягилев
5
Другое решение, которое не требует жесткого кодирования принимающего приложения и поэтому более безопасно:
Да, это возможно. Но для этого нужен телефон для установки непроверенных источников. Например, slideMe делает это. Я думаю, что лучшее, что вы можете сделать, это проверить, присутствует ли приложение, и отправить намерение в Android Market. Вы должны использовать что-то схему URL для Android Market.
market://details?id=package.name
Я не знаю точно, как начать задание, но если вы начнете занятие с такого рода URL. Это должно открыть Android Market и дать вам выбор для установки приложений.
Как я вижу, это решение ближе всего к истине :). Но это не подходит для моего случая. Мне нужен динамический загрузчик, зависящий от текущей среды пользователя и выходящий на рынок - не очень хорошее решение. Но все равно спасибо.
Alkersan
4
Стоит отметить, что если вы используете DownloadManagerдля запуска загрузки, обязательно сохраните ее во внешнем местоположении, например setDestinationInExternalFilesDir(c, null, "<your name here>).apk";. Намерение с типом пакета-архива, похоже, не похоже на content:схему, используемую при загрузке во внутреннее местоположение, но ему нравится file:. (Попытка обернуть внутренний путь в объект File и затем получить путь также не работает, даже если это приводит к file:URL-адресу, поскольку приложение не анализирует apk; похоже, оно должно быть внешним.)
String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));String title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length());Intent intent =newIntent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(newFile(filePath)),"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// without this flag android returned a intent error!MainActivity.this.startActivity(intent);
UpdateNode предоставляет API для Android для установки пакетов APK из другого приложения.
Вы можете просто определить свое обновление онлайн и интегрировать API в свое приложение - и все.
В настоящее время API находится в бета-состоянии, но вы уже можете выполнить некоторые тесты самостоятельно.
Кроме того, UpdateNode предлагает также отображение сообщений через систему - довольно полезно, если вы хотите рассказать что-то важное для ваших пользователей.
Я являюсь частью команды разработчиков клиента и использую по крайней мере функциональность сообщений для моего собственного приложения для Android.
В версии Oreo и выше нам нужно разрешение на установку неизвестного ресурса. так что в результате деятельности вы должны проверить результат на разрешение
Ответы:
Вы можете легко запустить ссылку на магазин Play Play или приглашение к установке:
или
Однако вы не можете установить .apks без явного разрешения пользователя ; нет, если устройство и ваша программа не рутированы.
источник
/sdcard
жесткий код, поскольку это неправильно на Android 2.2+ и других устройствах. ИспользуйтеEnvironment.getExternalStorageDirectory()
вместо этого.У меня была такая же проблема, и после нескольких попыток у меня все получилось. Я не знаю почему, но установка данных и типа по отдельности провалила мои намерения.
источник
setData()
, вызывает удаление параметра типа. Вы ДОЛЖНЫ использовать,setDataAndType()
если хотите дать значения для обоих. Здесь: developer.android.com/reference/android/content/…Решения, предоставленные на этот вопрос, все применимы к
targetSdkVersion
с 23 и ниже. Однако для Android N, то есть уровня API 24 и выше, они не работают и аварийно завершают работу со следующим исключением:Это связано с тем, что, начиная с Android 24,
Uri
изменился адрес для загруженного файла. Например, установочный файл с именем,appName.apk
хранящимся в основной внешней файловой системе приложения с именем пакета,com.example.test
будет иметь видfile:///storage/emulated/0/Android/data/com.example.test/files/appName.apk
для
API 23
и ниже, тогда как что-то вродеза
API 24
и выше.Более подробную информацию об этом можно найти здесь, и я не собираюсь проходить через это.
Чтобы ответить на вопрос
targetSdkVersion
о24
и выше, необходимо выполнить следующие шаги: Добавьте следующее в AndroidManifest.xml:2. Добавьте следующий
paths.xml
файл вxml
папкуres
в src, main:Это
pathName
то, что показано в приведенном выше примере содержимого иpathValue
является фактическим путем в системе. Было бы неплохо поставить "." (без кавычек) для pathValue в приведенном выше, если вы не хотите добавлять какие-либо дополнительные подкаталоги.Напишите следующий код для установки apk с именем
appName.apk
в основной внешней файловой системе:Разрешение также не требуется при записи в личный каталог вашего приложения во внешней файловой системе.
Я написал здесь библиотеку автообновления, в которой я использовал вышеизложенное.
источник
.authorityStr
после,context.getPackageName()
это должно работать.Ну, я покопался глубже и нашел источники приложения PackageInstaller из Android Source.
https://github.com/android/platform_packages_apps_packageinstaller
Из декларации я обнаружил, что для этого требуется разрешение:
И фактический процесс установки происходит после подтверждения
источник
Я просто хочу поделиться тем фактом, что мой apk-файл был сохранен в директории «Data» моего приложения и что мне нужно было изменить разрешения для apk-файла, чтобы они были доступны для чтения всем пользователям, чтобы разрешить его установку таким образом, в противном случае система выдает «Ошибка синтаксического анализа: существует проблема с анализом пакета»; так что используя решение @Horaceman, которое делает:
источник
Это может сильно помочь другим!
Первый:
Второе: для Android 7 и выше вы должны определить провайдера в манифесте, как показано ниже!
Третье: определите path.xml в папке res / xml, как показано ниже! Я использую этот путь для внутреннего хранения, если вы хотите изменить его на что-то еще, есть несколько способов! Вы можете перейти по этой ссылке: FileProvider
Forth: Вы должны добавить это разрешение в манифест:
источник
Другое решение, которое не требует жесткого кодирования принимающего приложения и поэтому более безопасно:
источник
Да, это возможно. Но для этого нужен телефон для установки непроверенных источников. Например, slideMe делает это. Я думаю, что лучшее, что вы можете сделать, это проверить, присутствует ли приложение, и отправить намерение в Android Market. Вы должны использовать что-то схему URL для Android Market.
Я не знаю точно, как начать задание, но если вы начнете занятие с такого рода URL. Это должно открыть Android Market и дать вам выбор для установки приложений.
источник
Стоит отметить, что если вы используете
DownloadManager
для запуска загрузки, обязательно сохраните ее во внешнем местоположении, напримерsetDestinationInExternalFilesDir(c, null, "<your name here>).apk";
. Намерение с типом пакета-архива, похоже, не похоже наcontent:
схему, используемую при загрузке во внутреннее местоположение, но ему нравитсяfile:
. (Попытка обернуть внутренний путь в объект File и затем получить путь также не работает, даже если это приводит кfile:
URL-адресу, поскольку приложение не анализирует apk; похоже, оно должно быть внешним.)Пример:
источник
Не забудьте запросить разрешения:
Добавьте в AndroidManifest.xml провайдера и разрешение:
Создать провайдера XML-файла res / xml / provider_paths.xml
Используйте приведенный ниже пример кода:
источник
Просто расширение, если кому-то нужна библиотека, это может помочь. Благодаря Рагхаву
источник
попробуй это
источник
Сначала добавьте следующую строку в AndroidManifest.xml:
Затем используйте следующий код для установки apk:
источник
UpdateNode предоставляет API для Android для установки пакетов APK из другого приложения.
Вы можете просто определить свое обновление онлайн и интегрировать API в свое приложение - и все.
В настоящее время API находится в бета-состоянии, но вы уже можете выполнить некоторые тесты самостоятельно.
Кроме того, UpdateNode предлагает также отображение сообщений через систему - довольно полезно, если вы хотите рассказать что-то важное для ваших пользователей.
Я являюсь частью команды разработчиков клиента и использую по крайней мере функциональность сообщений для моего собственного приложения для Android.
Смотрите здесь описание, как интегрировать API
источник
Попробуйте это - напишите на Манифесте:
Напишите код:
источник
В Android Oreo и выше версии мы должны подходить к различным методам, чтобы установить apk программно.
В версии Oreo и выше нам нужно разрешение на установку неизвестного ресурса. так что в результате деятельности вы должны проверить результат на разрешение
источник