Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как программно обновить и запустить другое приложение (Андроид)?


SerhioUser

Вопрос

Здравствуйте!

 

Вопрос по Андроиду.

Как из одного приложения (A) запустить инсталляцию apk другого приложения (Б) (желательно полностью в авто режиме), а потом из приложения (A) запустить приложение (Б)?

Объясняю зачем: делается корпоративная программа, (работающая на нескольких планшетах), которая часто обновляется, и нужно написать агент, который должен в авто-режиме принимать apk по сети и обновлять приложение (Б).

Пишу на C++ Builder XE6, Андроид 7.

 

Спасибо.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Как я понимаю "полностью авто режим" это подобие "silent"-режима Windows ? 

  1. Деплоит приложения при разработке к приложению-инсталлятору
  2. Запуск приложения через "намерения" (intent)

По поводу "авто режима" сомневаюсь... В любом случае Android покажет активити с успешной установкой и т.д.

Ссылка на комментарий
  • 0
  • Модераторы

Пока мне видится только такой вариант (полуавтоматический):

Наше приложение будет проверять новые версии через интернет или ещё как-то. Если новая версия появилась на сервере, то приложение скачивает новый apk, после чего через интент запускаем этот apk. Ну и там уже жмём вручную кнопку «Далее».

 

Если я правильно понял, то вам необходимо, что-то типо «Play» маркета, только своего. Тут есть несколько важных замечаний, даже при автоматическом обновлении из маркета, может выскочить табличка, для подтверждения прав необходимых приложению. Вроде, такое происходит, только когда права изменяются.

По окончанию обновления, в любом случае (других случаев пока не встречал) будет уведомление об окончании установки.

 

Вообще надо покопаться в Android API, возможно решение всё-таки есть.

Ссылка на комментарий
  • 0
  • Модераторы

Тут важно понимать задачу более точно/подробно, если обновляется именно приложение, т.е.  например, появляются новые функции и т.п., то конечно надо искать варианты.

А если под словами «которая часто обновляется» вы имеете в виду обновление базы или каких-то xml файлов прикреплённых к apk, при этом приложение остаётся таким же, то проще обновлять именно эти файлы, а не всё приложение.

Ссылка на комментарий
  • 0
Если я правильно понял, то вам необходимо, что-то типо «Play» маркета, только своего.

 

Да, что-то типа «Play» маркета, только в масштабах одной комнаты, гле лежат аппараты.

По сути обновляется именно приложение, т.е. обновляется его версия. Может быть добавлен функционал или исправлены баги. И нужно новую версию установить на штук 20 планшетов. А проводить ручную установку или полуручную не есть гуд.

Кстати, вариант с "раздельной компиляцией" тоже вариант.

Может есть возможность получить потроха apk по отдельности и просто переписать файлы установленного приложения?

 

2 Nix0N

 

А где можно почитать про "намерения" (intent)?

Ссылка на комментарий
  • 0

SerhioUser

 

А что если попробовать вариант работы двух прог (сам на андройде такое не пробовал. просто как предложение)? Одна эдакий апдейтер/лаунчер, другая - сама прога. Взаимно настроить у них в манифесте доступность друг к другу. Апдейтер/Лаунчер проверяет обновления, сливает чегось по необходимости. Обновляет (не знаю можно ль так нагло в андройде) либы и прочее основной проги. Запускает основную прогу (условно) с каким нить параметром и закрывается. Основная прога при обычном запуске - запускает апдейтер/лаунчер и закрывается. Может самая элегантная схема, но вполне рабочая... Для винды ;) . В рамках андройда, повторюсь, - не пробовал.

 

...

 

Вот тут на форуме чуток обсуждалось про интенты (и это отдельная и большая тема, имхо...). Еще можно прочитать тут (с примерами в дельфе), и тут (про интенты вообще).

Ссылка на комментарий
  • 0

2 konung

 

Вариант с апдейтером/лаунчером - идеальный, если это конечно возможно для андроида. Ситуация как раз такая, что у нас написан именно такой вариант проги для Windows. Только сей апдейтер/лаунчер постоянно сидит резидентом и следит за обновлениями. Теперь нужно организовать подобное в  Андроиде.

 

За инфо про интенты - спасибо, посмотрю... и я уже начал понимать, что это большой кусок знаний. :)

Ссылка на комментарий
  • 0
  • Модераторы

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

 

Но, кажется, я нашёл вам решение - это приватный канал в "Google Play", т.е. приложение будет доступно только для вашей организации. Т.о. всё будет именно так как вам и надо, т.е. авто-обновление и вам вообще не нужно будет ни каких лишних приложений.

 

Вот вам ссылки по теме:

https://support.google.com/a/answer/2494992?hl=ru

http://googleenterprise.blogspot.ru/2012/12/a-new-way-to-distribute-your-internal.html

 

Это скорее всего самый правильный и простой способ.

Ссылка на комментарий
  • 0

Возможно это и самый правильный способ, но для нас неприемлемый. В нашей организации выгружать приложение в и-нет никто не позволит. (Коммерческая тайна и т.д и т.п.) К тому же инет не всегда есть. А вносить изменения бывает нужно "ну прямо щас!". Нужны обходные решения...

А где лежат установленные приложения? Можно ли на уровне файловой системы добраться до файлов приложения и переписать их?

Нам не нужно эмулировать Play маркет. Достаточно просто обновить "экзешник", или как он у андроида называется. И было-бы гуд! :)

Ссылка на комментарий
  • 0
  • Модераторы

Для вашего случая, нет готового решения, нужно экспериментировать…

Вот тут http://delphifmandroid.blogspot.ru/2014/02/blog-post_16.html, я углублялся в эту тему, но не настолько глубоко как вам надо. Я не уверен, что Ось позволит заменить apk файл без её ведома (т.к. директория является системной)… В общем надо проверять, тестить и т.п.

Ссылка на комментарий
  • 0

Сейчас почитаю Вашу ссылку...

А какой базовый путь для установленных программ? По типу как "C:\Programm Files\" в win.

И думаю нужно будет дать root-права для доступа к такой папке?

Изменено пользователем SerhioUser
Ссылка на комментарий
  • 0

Пардон, почитал http://delphifmandroid.blogspot.ru/2014/02/blog-post_16.html и получил ответ на свой предыдущий пост.

 

Кстати очень полезная статья!!! Весьма благодарю, Andrey Yefimov - есть от чего оттолкнуться для изысканий решения!

Изменено пользователем SerhioUser
Ссылка на комментарий
  • 0

Кстати, пища для размышлений: RAD Studio при компиляции в конкретное устройство собирает приложение и инсталлирует его по тихому, при чем в папку видимую только под root-правами, при этом root-права на устройство НЕ УСТАНОВЛЕНЫ! Значит это как-то возможно... И даже без рутирования...

Ссылка на комментарий
  • 0

Вот здесь: http://stackoverflow.com/questions/4967669/android-install-apk-programmatically нашел инфо как инициировать установку apk, но это пример на яве. Не знаю это тихая установка или нет, но это уже что-то.

Суть реализации:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Кто-то может изложить сие на с++ или на pas?

Изменено пользователем Andrey Yefimov
Добавил тег "Код"
Ссылка на комментарий
  • 0

Сам спросил - сам отвечаю.

Вот реализация на Delphi:

var
  intent: JIntent;
  uri: Jnet_Uri;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);

  uri := TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(TPath.Combine(TPath.GetDownloadsPath, 'app.apk'))));
  Intent.setDataAndType(uri, StringToJString('application/vnd.android.package-archive'));
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  SharedActivity.startActivity(Intent);
end;

Эта штука запускает установку app.apk, лежащего в GetDownloadsPath(). Но это не тихая установка и требует подтверждению юзера.

Думаю для копилки знаний этот код будет полезен, однако мой вопрос о тихой установке все еще открыт.

 

P.S.

Почему то более простая конструкция:

Intent.setDataAndType(StrToJURI(TPath.Combine(TPath.GetDownloadsPath, 'app.apk')),  StringToJString('application/vnd.android.package-archive'));

не сработала. :(

Изменено пользователем SerhioUser
Добавил тег "Код"
Ссылка на комментарий
  • 0
  • Модераторы
Кто-то может изложить сие на с++ или на pas?

 

 

Это Интент, про них вам уже писали выше.

Данный интент будет выглядеть так:


p.s. В будущем, для кода, добавляйте специальный тег "Код", так намного читабельнее.

Ссылка на комментарий
  • 0
В 5/12/2014 в 17:42, SerhioUser сказал:

Сам спросил - сам отвечаю.

Вот реализация на Delphi:


var
  intent: JIntent;
  uri: Jnet_Uri;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);

  uri := TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(TPath.Combine(TPath.GetDownloadsPath, 'app.apk'))));
  Intent.setDataAndType(uri, StringToJString('application/vnd.android.package-archive'));
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  SharedActivity.startActivity(Intent);
end;

Эта штука запускает установку app.apk, лежащего в GetDownloadsPath(). Но это не тихая установка и требует подтверждению юзера.

Думаю для копилки знаний этот код будет полезен, однако мой вопрос о тихой установке все еще открыт.

 

P.S.

Почему то более простая конструкция:


Intent.setDataAndType(StrToJURI(TPath.Combine(TPath.GetDownloadsPath, 'app.apk')),  StringToJString('application/vnd.android.package-archive'));

не сработала. :(

_di_JIntent newIntent = TJIntent::Create();
    newIntent->setAction(TJIntent::JavaClass->ACTION_VIEW);
    _di_JMimeTypeMap mime = TJMimeTypeMap::JavaClass->getSingleton();
    _di_JString ExtToMime = mime->getMimeTypeFromExtension(StringToJString(L"apk"));
    String pth = System::Ioutils::TPath::GetPublicPath() + L"/app.apk";   // path app.apk
    _di_JFile my_file = TJFile::JavaClass->init(StringToJString(pth));
    _di_Jnet_Uri uri = TJnet_Uri::JavaClass->fromFile(my_file);
    newIntent->setDataAndType(uri,ExtToMime);
    int my_flag = TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK;
    newIntent->setFlags(flag);
    SharedActivity()->startActivity(newIntent);

Ссылка на комментарий
  • 0

#include <Androidapi.JNI.JavaTypes.hpp>
#include <Androidapi.Helpers.hpp>
#include <Androidapi.JNI.Embarcadero.hpp>
#include <Androidapi.JNI.GraphicsContentViewText.hpp>

for Rad Studio 10

Изменено пользователем Astghik
Ссылка на комментарий
  • 0

Маленькая ошибочка, но спасибо за CPP-вариант!

22 часа назад, Astghik сказал:

    int my_flag = TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK;
    newIntent->setFlags(my_flag);

Ссылка на комментарий
  • 1
В 12.10.2014 в 15:11, beknazar сказал:

Ничего не работает!

Нужно использовать TPath.GetSharedDownloadsPath

TPath.Combine(TPath.GetSharedDownloadsPath+ PathDelim, 'app.apk')

////////////////////  запуск приложения

var
  intent: JIntent;
  uri: Jnet_Uri;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);

  uri := TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(TPath.Combine(TPath.GetSharedDownloadsPath+ PathDelim, 'app.apk'))));
  Intent.setDataAndType(uri, StringToJString('application/vnd.android.package-archive'));
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  SharedActivity.startActivity(Intent);

end;

////////////////// открытие файла

 var
  ExtFile: string;
  mime: JMimeTypeMap;
  ExtToMime: JString;
  Intent: JIntent;
begin
  ExtFile := 'docx';
  mime := TJMimeTypeMap.JavaClass.getSingleton();
  ExtToMime := mime.getMimeTypeFromExtension(StringToJString(ExtFile));

  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setDataAndType(StrToJURI('file:' + TPath.Combine(TPath.GetSharedDownloadsPath + PathDelim, 'Инструкция по обновлению.docx')), ExtToMime);
  SharedActivity.startActivity(Intent);
end;


////////////// uses модули для подключения

Androidapi.JNI.GraphicsContentViewText;
Androidapi.JNI.App;
Androidapi.Helpers;
Androidapi.JNI.Net;
Androidapi.JNI.JavaTypes;
System.IOUtils;


System.DateUtils;
System.SysUtils;

Изменено пользователем Артур Насруллаев
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...