Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
SerhioUser

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

Вопрос

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

 

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

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

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

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

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

SerhioUser

 

Тоже озадачивался подобным вопросом. Но в ином ракурсе. Вот тут пытаюсь испросить иной вариант:

http://fire-monkey.ru/topic/228-kompiliatciia-modulei-razdelno/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 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 эмодзи.

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

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

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

Авторизация  

  • Похожий контент

    • От Женя
      В визуал студии в Xamarin есть такой класс -Java.Security.KeyStore Class, этот класс(как я понял) отвечает за подключение к хранилищу ключей  андроида,короче говоря Android keystore system .
      А вот как  достучаться до этой функции  в с++builder ?Я хочу сделать привязку  приложения  через  Android keystore system ,а как это сделать в Rad  студии не знаю
    • От the BestJVS
      Добрый день, у меня такой вопрос: как сделать автоматическое масштабирование компонентов под любое разрешение с сохранением пропорций на андроиде? Уже много искал по этому поводу, align=scale не работает, TscaledLayout аналогично, для каждого компонента прописывать scaled.x и scaled.y проблематично. Я новичок, прошу вашей помощи
    • От nassl
      Нужна помощь!
      Все перепробовал, не выходит каменный цветок...
      На форме лежит скрытый компонент THUETrackBar.
      Хочется реализовать следующий функционал на с++ (fmx): свайп вверх по любому месту экрана - делает компонент THUETrackBar видимым, и двигает его ползунок вверх, свайп  вниз - соответственно вниз.
      этот код не фурычит в процессе свайпа, только по завершении
       
      void __fastcall TForm1::windGesture(TObject *Sender, const TGestureEventInfo &EventInfo, bool &Handled) { switch (EventInfo.GestureID) { case sgiUp: TmpBar->Visible=true; TmpBar->Value++; break; case sgiDown: TmpBar->Visible=true; TmpBar->Value--; break; case igiLongTap: TmpBar->Visible=true;Location_x=EventInfo.Location.x; break; } } Хотел использовать свойство EventInfo.Location.x, но значение меняется только по окончании свайпа. 
       
       
    • От Farhodjon
      Привет всем, я здес новинки. Нужна ваша помош как подклучит служба на delphi xe8 исзодник или видеоурок на delphi xe8 есть? Помагите пожвлуста очен надв мне это подклучени
    • От Евгений Гайдук
      Помогите решить проблему. Есть андроид-планшет, есть серверный ПК. Нужно данные, вводимые на планшете сохранить в сетевую папку на сервере. Может есть возможность подключить сетевой ресурс на андроид планшете, либо напрямую сохранять в сетевую папку.
    • От Pulsarius
      Привет, форумчане! Я уже как-то задавал подобный вопрос, но видимо никто не сталкивался с этим. Может быть сейчас кто-нибудь столкнулся. Эта проблема качует из версии в версию и никто не исправляет это, а может быть я что-то не всё правильно делаю. Конкретнее, я в своём проекте использовал TcxPageControl от DevExpress и TFDConnection, TFDQuery от FireDAC. Теперь я удалил эти элементы из своего проекта, совершенно нигде не использую TcxPageControl и приложение у меня теперь не коннектится напрямую с базой данных. Вручную почистил все #include и #pragma link, но линковщик C++ Builder мне всё равно усердно впихивает cxPageControlRS25.bpl и firedac250.bpl в exe-шник. Если делать Deployment на удалённую машину с динамическими зависимостями от рантаймов, то соответственно туда тоже копируются эти ненужные cxPageControlRS25.bpl и firedac250.bpl. Открыл проект *.cbproj как текст и увидел там эти самые названия. Можно конечно вручную тоже их поудалять, но есть ли какой-то адекватный способ удаления зависимостей от уже ненужных библиотек, что бы вручную не выкосить что-нибудь лишнее? Это я как пример всего две bpl упамянул, а на самом деле там больше, ведь DevExpress и FireDAC там за собой тащат ещё кучу всяких bpl, типа там dxCore.bpl, datadb.bpl и т.п. Вот и происходит такая мусорка в скомпилированном файле и размер соответственно напрасно большой делается. В Visual Studio я с подобным не сталкивался.
    • От Pulsarius
      Здравствуйте, Ярослав! Скажите, пожалуйста, есть ли какая либо информация о планах поддержки Linux в C++ Builder? Нашей компании очень подходит RAD Studio для наших целей и быстрой разработки. Планируем приобрести лицензию. В ближайшее время планируем разрабатывать наше решение для Windows, macOS и Android, пока этого достаточно. Но есть некоторые сомнения о выборе RAD Studio и всё из-за того, что примерно через год потребуется наше решение реализовать и для Linux. Какова вероятность, что C++ Builder обзаведётся поддержкой Linux'а в течении 1 - 1,5 года? Delphi не рассматриваем. Заранее спасибо за ответ.
    • От Alex Bakulin
      Создаю стандартное мобильное приложение, которое предлагает Delphi Berlin. Там есть обработчик кнопки Назад. Собственно у меня задача, после того, как человек перешел в какой-то из режимов приложения, на эту кнопку реагировать, а именно присваивать Key := 0 и делать Application.Terminate. Но это не срабатывает, пролистываются все экраны приложения до первого и только после этого идет выход...
      Возможно я что-то не так для Андроид использую. Как мне закрыть приложение по этой кнопке? 
    • От MolarMak
      Всем доброго времени суток, столкнулся с такой проблемой, на определенной форме включается медиаплеер и начинает проигрывать определенный трек, но при блокировке трек продолжает играть. Как обработать событие блокировки экрана и по нему отключать медиаплеер? Пишу на c++ builder.
      Пробовал делать через EnteredBackground, руководствовался заметкой по написанию подобного на Delphi xe http://delphifmandroid.blogspot.com/2013/10/blog-post.html
      Возможно есть другие варианты решения?
    • От Pulsarius
      Привет всем! Скажите, кто-нибудь сталкивался с проблемой компиляции проекта с использованием FireDAC в C++ Builder (RAD Studio 10 Seattle) под Windows 64-bit? В проекте есть такие компоненты, как TFDConnection, TFDQuery, TFDTable. TFDConnection настроен на работу с SQLite. При компиляции в режиме Release, естественно с отключенными Dynamic RTL и Link with runtime packages, под Windows 32-bit всё в порядке, а вот под Windows 64-bit происходит ошибка, как я понял, линковщика:
      [ilink64 Warning] Warning: Out of memory [ilink64 Error] "ilink32" exited with code 2. Мне так кажется, что нет статических библиотек FireDAC для Windows 64-bit, и тем самым не удастся собрать проект со статической линковкой нужных либ, а только придётся таскать нужные библиотеки за exe-шником. Я правильно понимаю?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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