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

Загрузка извне apk-пакета и запуск его на установку


Mazzay

Вопрос

Моё приложение при запуске проверяет номер версии и при необходимости обновляется. Обновляется следующим образом: грузит с сервера и сохраняет на устройстве apk-пакет и запускает его на выполнение. Всё замечательно работало до перехода на Android 5.1. Загрузка пакета осуществляется в папку, возвращаемую GetSharedDownloadsPath. Запуск обновления производится следующим кодом:

_di_JIntent Intent;
_di_Jnet_Uri oUri;
_di_JFile oPath;
_di_JFile oFile;

oPath = TJFile::JavaClass->init(StringToJString(fPath)); // fPath = System::Ioutils::TPath::GetSharedDownloadsPath();
oFile = TJFile::JavaClass->init(oPath, StringToJString(fFile)); // fFile = L"myapp.apk"
oUri = TJnet_Uri::JavaClass->fromFile(oFile);

Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW);
Intent->setDataAndType(oUri, StringToJString(L"application/vnd.android.package-archive"));
Intent->setFlags(TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK);
SharedActivity()->startActivity(Intent);
Application->Terminate();

На Android 5.1 на выполнении этого кода получаю сообщение "... Access denied."

Не помню, где, нарыл следующее:

Цитата

Примечание. Каталог вашего приложения во внутренней памяти указывается с использованием имени пакета приложения в определенном месте файловой системы Android. Технически другое приложение может прочитать ваши файлы во внутренней памяти, если вы установите для файлов режим Readable (доступно для чтения). Однако для этого другому приложению должны быть известны имя пакета вашего приложения и имена файлов. Другие приложения не могут просматривать внутренние каталоги вашего приложения и не имеют разрешений на чтение или запись, если вы специально не установите для своих файлов режим Readable (доступно для чтения) или Writable (доступно для записи). Следовательно, пока вы будете использовать режим MODE_PRIVATE для своих файлов во внутренней памяти, они будут недоступны другим приложениям.

Как установить для файла режим Readable, чтобы его могло читать другое приложение?

 

P.S. Внешней карты памяти на устройстве нет. Если её вставить, то работает, ибо с ней GetSharedDownloadsPath возвращает путь именно на внешней карте. Втыкание внешней карты пока рассматривается только как временный костыль, но он не очень интересен, так как устройств, на которых работает приложение 18 штук — не хочется покупать 18 карточек.

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

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

  • 0

Все это касается только частной папки вашего приложения. А общие папки все равно должны быть. Там несколько функций GetShared...Path() 

попробуйте другую

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

Рекомендую в коде проверять наличие общих папок. Недавно столкнулся на 6 андроиде с тем, что  GetSharedDocumentPath не существовала. Просто создал ее и приложение заработало.

Ссылка на комментарий
  • 0
15 минут назад, Кривяков Виталий сказал:

Рекомендую в коде проверять наличие общих папок. Недавно столкнулся на 6 андроиде с тем, что  GetSharedDocumentPath не существовала. Просто создал ее и приложение заработало.

Спасибо! Очень дельный совет. Наверняка очень многие будут об это спотыкаться. Добавлю себе создание несуществующих папок на всякий случай. Но!

Android 5.1 без внешней карты памяти не даёт мне создать ничего в путях из списка GetShared... К примеру, GetSharedDocumentPath возвращает «/storage/sdcard/Documents». Тот же «ES Проводник» не может ничего создать в папке «/storage/sdcard» и пишет «SDCard отключена».

На 5.1 сохранение загруженного apk-файла у меня получается только в internal storage (4.2 позволяет сохранять куда угодно). Сохраняю в GetDocumentsPath (без …Shared…) и при запуске через Intent этого apk получаю «Ошибка при синтаксическом анализе пакета». (Сообщение «access/permission denied» что-то никак не могу повторить.) Такое сообщение и на 5.1, и на 4.2 (при запуске apk, сохранённого в internal storage). Если на 4.2 сохранить куда-нибудь в …Shared…, то этот же пакет замечательно устанавливается.

Я думаю, что установщик пытается открыть apk для анализа, но не может и выдаёт сообщение об ошибке при анализе.

Ссылка на комментарий
  • 0
31 минуту назад, krapotkin сказал:

Ошибка при синтаксическом анализе пакета у меня была, когда файл не докачался, т.е. по-сути, битый

Эмулятор Android 5.1 качает apk c компьютера-хоста. «Битость» фактически исключается. Но ошибку выдаёт. Смартфон под Android 4.2 успешно качает и устанавливает этот же apk и по воздуху.

Изменено пользователем Mazzay
Ссылка на комментарий
  • 0
4 часа назад, krapotkin сказал:

Там несколько функций GetShared...Path() 

попробуйте другую

Фух! Вот уж воистину. Бьёшься-бьёшься — не получается. Спросишь в интернете — и наведут на решение. Всё, что GetShared… не работает. Android 5.1 без карты памяти не хочет сохранять туда файл. У меня по крайней мере. Но очередной просмотр доступных методов у TPath навёл меня на вот какой: GetPublicPath. Описание от Embarcadero у него следующее:

Цитата

Returns the path to the directory where you can store application data that can be shared with other applications.

http://docwiki.embarcadero.com/Libraries/Berlin/en/System.IOUtils.TPath.GetPublicPath

Собственно, судя по описанию, то, что нужно. Пробую. Не работает. На эмуляторе GetPublicPath возвращает пустую строку. :(

Из описания:

Цитата

If the system running your application does not support the requested folder, or if the requested folder does not exist in the system, this function returns an empty string instead.

Расстроился. Но на всякий случай попробовал на реальном устройстве под Android 5.1. И о, чудо! GetPublicPath возвращает «/storage/sdcard0/Android/data/com.<ХХХХ.myappname>/files» и установка apk оттуда через Intent замечательно работает. Проводник тоже видит эту папку и файлы в ней.

На Android 4.2 тоже работает.

 

Всем большое спасибо!

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

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

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

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

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

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

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

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

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

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