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

Как запустить внешний APK для установки


AES

Вопрос

Подскажите, у меня программа проверяет наличие новой версии и выводит уведомление...

Хочу что бы программа сама закачивала APK и запускала его на установку...

Скачать по идее не проблема, а вот как показать окно юзеру, мастера установки этого АПК ?

Можно какой нибудь образец на Delphi ?

Пока вот что имею:

procedure TUpdateAppThread.Execute;
CONST
  url_download_nsis_script = 'https://.com/android/.apk';
var
  http: TNetHTTPClient;
  q: tmemorystream;
begin
  q := tmemorystream.Create;
  http := TNetHTTPClient.Create(nil);
  try
    try

      http.Get(PChar(url_download_nsis_script), q);
      q.Position := 0;
      q.SaveToFile(TPath.Combine(TPath.GetDocumentsPath, 'hs.update.apk'));

      if FileExists(TPath.Combine(TPath.GetDocumentsPath, 'hs.update.apk')) then
        Synchronize(StartUpdateApp);
    except
      Synchronize(ErrorUpdateApp);
    end;

  finally
    q.Free;
    http.Free;
  end;

end;


скачал APK, ошибок нет вроде, все ок...
Запихиваю апк в jnet_uri

Procedure StartUpdateApp;
var
  ApkFile: JFile;
  ApkUri: Jnet_Uri;
  path, filename: string;
begin
  try
    filename := TPath.Combine(TPath.GetDocumentsPath, 'hs.update.apk');
    ApkFile := TJfile.JavaClass.init(StringToJString(filename));
    ApkUri := TAndroidHelper.JFileToJURI(ApkFile);
    StartActivity(ApkUri);
  except
    on E: Exception do
      ShowMessage(E.ClassName + 'StartUpdateApp поднята ошибка, с сообщением : '
        + E.Message);

  end;
  UpdateForm.Label1.Text := 'Download ok.';
end;

Запускаю активность...

procedure StartActivity(ApkUri: Jnet_Uri);
var
  Intent: JIntent;
begin
  try
    Intent := TJIntent.Create();
    Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
    Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or
      TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or
      TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or
      TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
    Intent.setDataAndType(ApkUri,
      StringToJString('application/vnd.android.package-archive'));
    TAndroidHelper.Activity.StartActivity(Intent);
  except
    on E: Exception do
      ShowMessage(E.ClassName + 'StartActivity поднята ошибка, с сообщением : '
        + E.Message);

  end;
end;

 

 

сейчас у меня ошибка в процедуре StartUpdateApp

Java type Jcontent_fileprovider could not be found.

 

Разрешений пока не каких не запрашивал.... Сохраняю в TPath.Combine(TPath.GetDocumentsPath, 'hs.update.apk') сюда я так понимаю разрешения не нужны...

 

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

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

  • 0
 Для API >= 14 и API < 29
   Intent := TJIntent.Create();
    Intent.setAction(TJIntent.JavaClass.ACTION_INSTALL_PACKAGE);
    Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
    Intent.putExtra(TJIntent.JavaClass.EXTRA_NOT_UNKNOWN_SOURCE, true);
    Intent.setDataAndType(ApkUri,StringToJString('application/vnd.android.package-archive')); 
    TAndroidHelper.Activity.StartActivity(Intent);

 

API > 25 Manifest.permission.REQUEST_INSTALL_PACKAGES

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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