Обновите приложение для Android (без посещения магазина Google Play)

Я написал бета-версию приложения. Он будет доступен для загрузки через Интернет (я не буду публиковать его в Play Market). Можно ли обновить это приложение без посещения Play Market, когда выйдет новая версия?


person IQW    schedule 04.03.2013    source источник
comment
Да, это возможно. Помимо этого, что вы пробовали? и насколько глубоко вы хотите, чтобы это пошло? автообновление скачать и установить? или открыть браузер скачать и установить?   -  person Eluvatar    schedule 05.03.2013
comment
Спасибо за ответ, но Блюмер уже дал мне ответ с примером кода. Думаю для моего случая этого достаточно. Спасибо еще раз)   -  person IQW    schedule 05.03.2013
comment
@IQW Не могли бы вы показать код, который вы пробовали, потому что у меня такая же проблема, которую мне нужно проверить из домена, где я загрузил свой apk, и проверить, есть ли новая версия или нет?   -  person Abedin.Zhuniqi    schedule 09.04.2019


Ответы (5)


Абсолютно. Однако вам нужно будет создать механизм, чтобы ваше приложение звонило домой на сервер, выясняло, есть ли более новая версия приложения, и если есть, вытащите ее и установите. Как только вы определили, что вам действительно нужно загрузить обновление, вы можете сделать это с помощью чего-то похожего на эту AsyncTask:

protected String doInBackground(String... sUrl) {
    String path = "/sdcard/YourApp.apk";
    try {
        URL url = new URL(sUrl[0]);
        URLConnection connection = url.openConnection();
        connection.connect();

        int fileLength = connection.getContentLength();

        // download the file
        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(path);

        byte data[] = new byte[1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress((int) (total * 100 / fileLength));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();
    } catch (Exception e) {
        Log.e("YourApp", "Well that didn't work out so well...");
        Log.e("YourApp", e.getMessage());
    }
    return path;
}

// begin the installation by opening the resulting file
@Override
protected void onPostExecute(String path) {
    Intent i = new Intent();
    i.setAction(Intent.ACTION_VIEW);
    i.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive" );
    Log.d("Lofting", "About to install new .apk");
    this.context.startActivity(i);
}
person Blumer    schedule 04.03.2013
comment
Вопрос: что происходит с publishProgress ((int) (total * 100 / fileLength)) ;? Где будет вызываться этот метод и что он делает? Заранее спасибо. - person KingAlex1985; 10.07.2014
comment
apk будет автоматически удален после этого? - person stephanlindauer; 25.06.2015
comment
Несколько моментов, которые следует учитывать, если вы используете это решение: 1) да, это должно быть внешнее хранилище - внутреннее не используется совместно между приложениями и не отображается для установочного приложения 2) вы не можете использовать поставщика контента, потому что это не поддерживается установочным приложением (должен быть file: // ...) и 3) вы, вероятно, захотите использовать Environment.getExternalStorageDirectory() вместо жестко заданного пути. В противном случае это решение работает, спасибо! - person johndodo; 18.07.2016
comment
Могу ли я подавить запрос пользователя, если не запрашиваются дополнительные разрешения? - person Jaydev; 05.11.2016
comment
Это не работает в Android N, можете ли вы предложить какой-либо другой ответ, который также работает в Android N. - person Manikanta Ottiprolu; 11.01.2017
comment
Для Android NI пришлось добавить поставщик файлов или строгий режим: stackoverflow.com/questions/38200282/ - person Gudin; 15.07.2017
comment
Используя этот код в моем приложении. Приложение загружается и устанавливается успешно, но при повторном открытии появляется всплывающее окно с сообщением об ошибке There was a problem parsing the package. Пожалуйста, помогите мне здесь stackoverflow.com/questions/48313766/ - person Shambhu; 18.01.2018
comment
Работает ли это решение с приложением, написанным на Xamarin Forms? - person feldeOne; 25.04.2018
comment
@Blumer Вы можете увидеть мой вопрос? stackoverflow.com/questions/55587654/ - person Abedin.Zhuniqi; 09.04.2019
comment
И как объявлен publishProgress, потому что я использовал этот код, ноpublishProgress не объявлен? То же самое и с @Override, не переопределяющим метод из своего суперкласса. - person Abedin.Zhuniqi; 09.04.2019

Да, это возможно, вот что вы можете сделать примерно так:

  1. Получить код текущей версии приложения

    PackageInfo packageInfo = getPackageManager().getPackageInfo(context.getPackageName(), 0);
    int curVersionCode = packageInfo.versionCode;
    
  2. Имейте сервер, на котором вы размещаете файл apk и создаете простой простой файл, содержащий только одно целое число, которое представляет код последней версии приложения.

  3. Когда приложение запускается (или всякий раз, когда вы хотите проверить наличие обновлений), получите последний versionCode с сервера (например, через HTTP-запрос) и сравните его с текущей версией приложения.

  4. Если есть новая версия, загрузите apk и установите ее (появится диалоговое окно для пользователя).

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

Для этого можно использовать код @Blumer.

person iTech    schedule 04.03.2013
comment
Использование кода Блюмера в моем приложении. Приложение загружается и устанавливается успешно, но при повторном открытии появляется всплывающее окно с сообщением об ошибке There was a problem parsing the package. Пожалуйста, помогите мне здесь stackoverflow.com/questions/48313766/ - person Shambhu; 18.01.2018

это возможно, однако имейте в виду, что пользователю необходимо включить в настройках параметр «Разрешить установку приложений, не принадлежащих Маркету / неизвестных источников».

person stephanlindauer    schedule 25.11.2014
comment
У вас есть идеи, что произойдет, если вышеуказанный параметр отключен во время загрузки приложения. - person chandimak; 23.06.2015
comment
загрузка куда? магазин? это настройка на устройстве, а не в бинарных файлах или в маркете. вот что я имею в виду: tech-recipes.com/wp-content/uploads/ - person stephanlindauer; 24.06.2015
comment
Извините. Написано с ошибкой. Я хотел сказать «обновление», а не «загрузка». Итак, когда есть обновление для приложения и в это время статус вышеуказанного параметра - «отключить», что произойдет. Разрешает ли он автоматическое обновление или пользователю явно нужно снова установить вышеупомянутый параметр «включить». - person chandimak; 24.06.2015
comment
насколько я помню: вы могли бы скачать apk, но не смогли бы установить его. но стоит проверить текущее положение дел. Я думаю, что Google хотел полностью запретить эти самостоятельные обновления. - person stephanlindauer; 25.06.2015
comment
В Oreo (возможно, и в более старых версиях), если у вас нет этого набора разрешений, ОС сообщит вам, что это необходимо, и перейдет к соответствующей настройке. Вы можете настроить оттуда список приложений, которые можно устанавливать из неизвестных источников - пользователю необходимо будет настроить ваше приложение, чтобы это разрешило - person Dan Harris; 13.04.2018

К вашему сведению, я только что прочитал об этом на http://blog.vivekpanyam.com/evolve-seamlessly-deploy-android-apps-to-users/?hn

Evolve - это библиотека для разработчиков Android, которая позволяет им развертывать новые версии приложения, не заходя в Google Play и не прося пользователей загрузить обновление. Он работает, используя отражение и динамическую генерацию байт-кода, чтобы «обмануть» Android при запуске нового кода.

Хотя это альфа, но это кажется возможным через множество обручей. Сомневаюсь, что это стоит того, кроме вредоносных программ ..

person Barry Staes    schedule 19.02.2014

Официальная поддержка / библиотека для обновлений внутри приложений Ядро Google Play

  • Обновления внутри приложения - это функция библиотеки Play Core, которая предлагает активным пользователям обновить ваше приложение. Функция обновления в приложении поддерживается на устройствах под управлением Android 5.0 (уровень API 21) или выше и требует, чтобы ваше приложение использовало Play Core library версии 1.5.0 или выше. Кроме того, обновления в приложении поддерживаются только для мобильных устройств Android, планшетов Android и устройств с Chrome OS.

Ниже приведены типы потоков обновления

  1. Гибкие обновления (пример экрана)

введите описание изображения здесь

  1. Немедленное обновление (пример экрана)

введите описание изображения здесь

Ссылка: -Подробнее по этой теме

person Prags    schedule 06.07.2021