Пишем свой Android Market
И так, нам необходимо реализовать небольшое Android приложение, которое будет скачивать список доступных приложений, проверять наличие обновлений для уже установленных, устанавливать/удалять приложения.
Серверная часть
Серверной частью приложения может быть как сервис с широким функционалом (регистрация пользователей, отчеты, разграничение доступа к приложениям), так и просто xml файл:
В моем случае серверной частью фактически выступает http шара.
Данный xml файл в приложении трансформируется в список приложений, доступных для установки.
Установка
Пользователь выбирает нужное ему приложение и устанавливает,
Маркет скачивает apk файл на флешку устройства и инициирует установку приложения, конечно, должна быть разрешена установка из сторонних источников.
Установить незаметно в фоне мы не можем, поэтому после выполнения данного кода:
Пользователь увидит стандартное окно установки приложений:
Обновление
Приложение Market может по определенному интервалу проверять наличие новых версий, делается это достаточно просто, так как доступен список всех установленных приложений:
В случае необходимости обновления приложения, повторяем процесс Установки, приложение будет обновлено.
Удаление
Удалить программу лучше из интерфейса нашего маркета, чтобы не заставлять пользователя выискивать тестируемое приложение среди всех его программ, для этого достаточно вызвать этот код:
Обратная связь
Получение сообщений об ошибках, вместе с логом ошибки, очень важно для разработчика, особенно на этапе тестирования приложения, добавим функцию автоматического сбора этой информации через Маркет.
Для этого в каждое приложение, распространяемое через наш Маркет добавляем следующий класс
Как видно из кода, это хендлер, который получает ошибки (Exception), генерит строку со стеком, сохраняет ее в локальный файл и отправляет ошибку в виде броадкаст сообщения.
А в Application классе включаем переадресацию всех сообщений об ошибках в этот хендлер
Таким образом, если в тестируемои приложении происходит ошибка, то перед смертью пишется сообщение в лог и посылается броадкаст сообщение в маркет.,
Перед передачей приложения заказчику, этот код удаляется (комментируется).
В самом Маркете мы просто отлавливаем данное сообщение:
И дальше маркет уже может переслать это сообщение на почту разработчику, загрузить в какой нибудь веб-сервис или попросить пользователя добавить комментарий к ошибке
Я надеюсь, данный пример поможет многим начинающим разработчикам, разобраться, как написать свой универсальный велосипед для бета тестирования приложений и централизованному сбору статистики ошибок.
ps: В статье использован исходный код и картинки взятые из прототипа приложения.
Русские Блоги
Установка приложения под Android 8.0
каталог
Предисловие. После обновления системы Android до версии 8.0 Google удалил коммутатор для установки неизвестных приложений (все приложения, которые первоначально включили этот коммутатор, предоставили бы это разрешение), и заменил его списком управления приложениями из неизвестных источников. Установите разрешения для приложений из неизвестных источников. Если вы не обрабатываете разрешения этого неизвестного источника, он заблокирует внутреннее приложение, чтобы начать процесс установки, что приведет к тому, что приложение вообще не сможет быть обновлено и может быть загружено только снова на рынке приложений.
Так как бороться с этим разрешением?
1. Процесс установки приложения
1. Сначала поговорим о процессе установки до 8.0:
Скачайте приложение с сервера на локальный >> Откройте код приложения установки >> Установка завершена
2. Процесс установки приложения после 8.0:
Загрузите приложение с сервера на локальный >> Код, чтобы открыть интерфейс приложения источника местоположения установки >> Предоставить разрешения >> Откройте код приложения установки >> Установка завершена
Где «Код открывает интерфейс приложения источника местоположения установки» будет блокировать процесс установки приложения,Процесс установки не может продолжаться, пока вы не получите разрешение на установку неизвестных приложений.
3. Чтобы смоделировать загрузку обновлений приложений из Интернета, я поместил приложение непосредственно во внутреннее хранилище, нажал «Установить» и непосредственно выполнил процесс установки 8.0.
2. Сначала обратитесь за разрешением
Обработка прав чтения SD-карты, код выглядит следующим образом:
3. Нажмите кнопку, чтобы установить приложение
Код прост, кнопка для выполнения установки
4. Проверьте, есть ли у вас разрешения для неизвестных источников приложения
Комментарий очень ясен, здесь упоминаются только ключевые моменты: boolean b = getPackageManager (). CanRequestPackageInstalls (); эта строка кода проверяет, есть ли у вас разрешения для неизвестных источников приложения. Если у вас есть прямая установка, Откройте интерфейс неизвестного источника приложения без него. Обратите внимание, что это не то же самое, что подать заявку на разрешения во время выполнения (Многие люди путают разрешения во время выполнения!)
Обработайте результат обратного вызова в onActivityResult (), код выглядит следующим образом:
5. Выполните процесс установки
Выполните код установки:
Здесь нужно сказать, что параметр uri в intent.setDataAndType (uri, «application / vnd.android.package-archive») также должен быть адаптирован для систем 7.0 и выше, а поставщик должен быть установлен.
Я помещаю приложение прямо в корневой каталог:
Поставщик настроен следующим образом:
Файл file_paths_public.xml выглядит следующим образом:
путь = «.» означает корневой каталог внутреннего хранилища
Это введено в части провайдера, поэтому я не буду повторять это здесь.
Вы почти закончили, но есть несколько вещей, на которые стоит обратить внимание:
1. Для установки приложений из внутреннего хранилища необходимы разрешения времени выполнения SDCard. Если у вас нет этого разрешения, появится сообщение об ошибке разбора!
2. При запуске интерфейса установки intent.setDataAndType (uri, «application / vnd.android.package-archive»), пожалуйста, не забудьте выполнить адаптацию 7.0 в uri!
3. При тестировании apk, apk, помещенный во внутреннюю директорию хранилища, должен быть собран через build >> Build Apk (s), в противном случае приложение получит запрос, что оно не установлено во время установки! Смотри ниже
Поэтому, когда вы решите адаптироваться к 8.0, вы должны заняться другими адаптациями!
Установить приложение программно на Android
Мне интересно знать, возможно ли программно установить динамически загруженный APK из пользовательского приложения для Android.
ОТВЕТЫ
Ответ 1
Вы можете легко запустить ссылку на игровой магазин или запрос установки:
Ответ 2
У меня была такая же проблема, и после нескольких попыток это получилось для меня таким образом. Я не знаю, почему, но установка данных и типов отдельно прикрутила мое намерение.
Ответ 3
Решения, предоставляемые по этому вопросу, применимы к targetSdkVersion 23 и ниже. Однако для Android N, то есть API уровня 24 и выше, они не работают и не сбой со следующим Исключением:
для API 23 и ниже, тогда как что-то вроде
Более подробную информацию об этом можно найти здесь, и я не собираюсь проходить через него.
Чтобы ответить на вопрос targetSdkVersion 24 и выше, нужно выполнить следующие действия: Добавьте в AndroidManifest.xml следующее:
2. Добавьте следующий paths.xml файл в папку xml на res в src, main:
Напишите следующий код для установки apk с именем appName.apk в основной внешней файловой системе:
При записи в личный каталог собственного приложения во внешней файловой системе не требуется никаких разрешений.
Я написал библиотеку AutoUpdate здесь, в которой я использовал выше.
Ответ 4
Ну, я углубился глубже и нашел источники приложения PackageInstaller из Android Source.
Из манифеста я обнаружил, что для этого требуется разрешение:
И фактический процесс установки происходит после подтверждения
Ответ 5
Я просто хочу поделиться фактом, что мой файл apk был сохранен в моем каталоге «Данные» и что мне нужно было изменить разрешения на файл apk, чтобы он был доступен для чтения, чтобы он мог быть установлен таким образом, в противном случае система выбрасывала «Ошибка синтаксического анализа: существует проблема с анализом пакета»; поэтому используйте решение от @Horaceman, которое делает:
Ответ 6
Ответ 7
Другое решение, которое не требует жесткого кодирования получающего приложения, и, следовательно, более безопасно:
Ответ 8
Да, это возможно. Но для этого вам нужен телефон для установки непроверенных источников. Например, slideMe делает это. Я думаю, что самое лучшее, что вы можете сделать, это проверить, присутствует ли приложение и отправить намерение Android Market. вы должны использовать что-то URL-схему для Android-рынка.
Я не знаю, как начать работу, но если вы начнете работу с такого рода URL. Он должен открыть рынок Android и дать вам выбор для установки приложений.
Ответ 9
Ответ 10
Это может сильно помочь другим!
Первый:
Второе: для Android 7 и выше вы должны определить провайдера в манифесте, как показано ниже!
Третье: определите path.xml в папке res/xml, как показано ниже! Я использую этот путь для внутреннего хранения, если вы хотите изменить его на что-то еще, есть несколько способов! Вы можете перейти по этой ссылке: FileProvider
Forth: Вы должны добавить это разрешение в манифест:
Пожалуйста, убедитесь, что полномочия провайдера одинаковы!
Ответ 11
Просто расширение, если кому-то нужна библиотека, тогда this может помочь. Благодаря Raghav
Ответ 12
Ответ 13
UpdateNode предоставляет API для Android для установки пакетов APK из другого приложения.
Я являюсь частью команды клиента dev и использую хотя бы функциональность сообщений для своего собственного приложения для Android.
Ответ 14
Сначала добавьте следующую строку в AndroidManifest.xml:
Затем используйте следующий код для установки apk:
Android install apk with Intent.VIEW_ACTION not working with File provider
My app has an auto-update feature that download an APK and when the download is finished that a Intent.VIEW_ACTION to open the app and let the user install the downloaded apk
This works great for all the device Follow
4 Answers 4
After a lot of trying I have been able to solve this by creating different Intents for anything lower than Nougat as using the FileProvider to create an install intent with Android Versions before Nougat causes the error:
While using a normal Uri on Android Nougat creates the following error:
My solution which is working for me with Android N on the emulator and a phone running Android M.
UPDATE FOR Android Nougat 7.1:
You also need to add the permission REQUEST_INSTALL_PACKAGES in your manifest. Its available from Api Level 23 (Android 6.0 Marshmallow) and required from Level 25 (Android 7.1 Nougat).
UPDATE:
Remember to request the permissions for read and write to external storage if the file you try to install is on the external storage. And also to set up a correct FileProvider for Android Nougat and above.
First check if you have write permission by calling canReadWriteExternal() below, if not call requestPermission() before:
Here is an example of a file provider for the Download folder on the external storage. AndroidManifest.xml:
resources/xml/filepaths.xml:
UPDATE FOR Android Oreo 8.0:
You have to check if current application is allowed to install the APK on Android Oreo 8.0 or above.
You can check if your app is allowed to install APK by using canRequestPackageInstalls method of PackageManager class. If it returns false, then you can launch intent with ACTION_MANAGE_UNKNOWN_APP_SOURCES action to launch settings dialog where user can allow the app to install APKs.
Make sure you add the following code to your activity to receive the result of intent.
Установить приложение программно на Android
Мне интересно знать, возможно ли программно установить динамически загруженный apk из пользовательского приложения для Android.
Вы можете легко запустить ссылку на магазин Play Play или приглашение к установке:
У меня была такая же проблема, и после нескольких попыток у меня все получилось. Я не знаю почему, но установка данных и типа по отдельности провалила мои намерения.
Решения, предоставленные на этот вопрос, все применимы к targetSdkVersion с 23 и ниже. Однако для Android N, то есть уровня API 24 и выше, они не работают и аварийно завершают работу со следующим исключением:
Это связано с тем, что, начиная с Android 24, Uri изменился адрес для загруженного файла. Например, установочный файл с именем, appName.apk хранящимся в основной внешней файловой системе приложения с именем пакета, com.example.test будет иметь вид
для API 23 и ниже, тогда как что-то вроде
Более подробную информацию об этом можно найти здесь, и я не собираюсь проходить через это.
Чтобы ответить на вопрос targetSdkVersion о 24 и выше, необходимо выполнить следующие шаги: Добавьте следующее в AndroidManifest.xml:
2. Добавьте следующий paths.xml файл в xml папку res в src, main:
Это pathName то, что показано в приведенном выше примере содержимого и pathValue является фактическим путем в системе. Было бы неплохо поставить «.» (без кавычек) для pathValue в приведенном выше, если вы не хотите добавлять какие-либо дополнительные подкаталоги.
Напишите следующий код для установки apk с именем appName.apk в основной внешней файловой системе:
Разрешение также не требуется при записи в личный каталог вашего приложения во внешней файловой системе.
Я написал здесь библиотеку автообновления, в которой я использовал вышеизложенное.





