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

WebForm.Fmx


Tot999

Вопрос

Использую библиотеку Rest для работы с гугл-диском. Для авторизации вызываю Webform, под windows все работает хорошо. Стал переносить на Android (Rest.authenticator.oauth.webform.fmx) и столкнулся с проблемой, что андроид не вызывает функции копирования строки. 

В webform.win было свойство lasttitle из которого можно было достать access code.

В webform.fmx присутствует Flasturl, но он не меняется при закрытии формы.

 

Подскажите как быть?

 

 

post-1622-0-83799100-1442187460.png

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

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

  • 0
  • Модераторы

 делал когда-то так, может что изменилось

uses
{$IFDEF ANDROID}REST.Authenticator.OAuth.WebForm.FMX{$ELSE}REST.Authenticator.OAuth.WebForm.Win

var
WebView: Tfrm_OAuthWebForm;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  WebView := Tfrm_OAuthWebForm.Create(self);
  WebView.OnTitleChanged := self.OAuth2_GoogleTasks_BrowserTitleChanged;
end;  
...
procedure TForm1.OAuth2_GoogleTasks_BrowserTitleChanged(const ATitle: string;
  var DoCloseWebView: boolean);
begin
  if Pos('Success code', ATitle) > 0 then
  begin
    AuthCode := Copy(ATitle, 14, Length(ATitle));

    if (AuthCode <> '') then
    begin
      Memo1.Lines.Add(AuthCode);
      DoCloseWebView := true;
      WebView.Release;
    end;
  end;
end;
...
WebView.ShowWithURL(LURL);
Ссылка на комментарий
  • 0

Да, у меня также было сделано с примера webdelphi. Ваш код при компиляции под windows отлично работает. Title меняется из него извлекается Access Code, но при компиляции на андроид устройстве, события OnTitleChanged не происходит, при все тех же действиях.

открываю REST.Authenticator.OAuth.WebForm.Win и REST.Authenticator.OAuth.WebForm.FMX, начинаю сравнивать, в глаза бросается следующее:

...  private
    { Private declarations }
    FOnBeforeRedirect: TOAuth2WebFormRedirectEvent;
    FOnAfterRedirect: TOAuth2WebFormRedirectEvent;
    FOnBrowserTitleChanged : TOAuth2WebFormTitleChangedEvent;


    FLastTitle: string;  // <------- ЭТОГО нет в FMX
    FLastURL: string;
  public
...

В WebForm.FMX:

...  private
    { Private declarations }
    FOnBeforeRedirect: TOAuth2WebFormRedirectEvent;
    FOnAfterRedirect: TOAuth2WebFormRedirectEvent;
    FOnBrowserTitleChanged : TOAuth2WebFormTitleChangedEvent;


    FLastURL: string;
...  public

В случае с Win можно также извлечь код из свойства lasttitle, опять-таки в FMX только Flasturl, но он остается неизменным. Пробовал в Delphi XE7  и Delphi XE8.

Может, как-то можно из WebBrowser достать значение? 

 

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

Мужики, нужны пояснения. Реализую rest delphi xe7 + google api oauth 2.0. Код, привел в порядок с примером ZuBy:

uses


  {$IF DEFINED(ANDROID)}
       REST.Authenticator.OAuth.WebForm.FMX , Androidapi.Helpers,
    Androidapi.jni , AndroidAPI.JNIBridge, Androidapi.JNI.JavaTypes,  FMX.Helpers.Android,
    Androidapi.JNI.GraphicsContentViewText;
  {$ENDIF}
  {$IF DEFINED(MsWindows)}
    REST.Authenticator.OAuth.WebForm.Win;
  {$ENDIF}


...
  private
    { Private declarations }
    WebForm: Tfrm_OAuthWebForm;
    procedure Auth;
    procedure OAuth2_GoogleTasks_BrowserTitleChanged(const ATitle: string;  var DoCloseWebView: boolean);
  public
    { Public declarations }
...


procedure TForm2.OAuth2_GoogleTasks_BrowserTitleChanged(const ATitle: string;
  var DoCloseWebView: boolean);
begin
  //Memo3.text:=(webform.LastURL);
  if Pos('Success code', ATitle) > 0 then
  begin
    AuthCode := Copy(ATitle, 14, Length(ATitle));
    if (AuthCode <> '') then
    begin
      //Memo3.Lines.Add(AuthCode);
      editactoken.Text:= AuthCode;
      DoCloseWebView := true;
      webform.Release;
    end;
  end;
end;


procedure TForm2.Button59Click(Sender: TObject);
begin
      WebForm:=Tfrm_OAuthWebForm.Create(nil);
      WebForm.OnTitleChanged  := self.OAuth2_GoogleTasks_BrowserTitleChanged;
     WebForm.ShowWithURL(OAuth2Authenticator1.AuthorizationRequestURI);
end;

На windows все работает, на Android не происходит события TitleChanged, меняю так:

 

procedure TForm2.OAuth2_GoogleTasks_BrowserTitleChanged(const ATitle: string;
  var DoCloseWebView: boolean);
begin
   ListBoxDatabase.Items.Add(ATitle);
end;

На Windows отображаются все заголовки, на Android - пусто.  

Оставляю webform, просто пробую открыть страницу авторизации в дефолтном браузере на устройстве:

var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setData(StrToJURI(OAuth2Authenticator1.AuthorizationRequestURI));
  SharedActivity.startActivity(Intent);

Результат на скриншотах внизу. Поясняю: из самого браузера скопировать строку не удается, не вызываются стандартные механизмы, в Title отлично видно, что Success Code пришел, когда на него кликаешь, чтобы скопировать, получаешь строку со скрина 3 (который ..approval... )

 

Просто создаю проект с браузером, открываю авторизацию в приложении, без webform  и пытаюсь скопировать код из тела webbrowser:

procedure TForm4.Button4Click(Sender: TObject);
Var
  Clipboard: IFMXClipboardService;
  value: TValue;
  hasText: boolean;
  s: string;
begin
  hasText := False;
  if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(Clipboard)) then
  begin
    value := Clipboard.GetClipboard;
    hasText := value.TryAsType<String>(s);
  end;
  ShowMessage(BoolToStr(hasText));
  if hasText then ShowMessage(s);
 end;

Не берет.

 

Читаю статьи:

https://developers.google.com/api-cl.../installed-app
https://developers.google.com/android/guides/http-auth

 

Понимаю, что авторизацию через веббраузер надо делать для installed applications, для Android необходимо использовать нативные библиотеки. Там правда не сказано, что нельзя делать авторизацию на android через webbrowser. В связи с этим у меня возникает пара вопросов:

 

1. Концептуально: Можно ли получать токен на Android вышеуказанным путем?

    Тактически: Если да, то в таком случае, как получить success code, в чем проблема? webform.fmx забыли припечатать title? Подскажите, что переделать.

( все остальное: обмен на токен, настройка коомпонентов, скачка, закачка файлов и т.д. все работает на винде исправно, т.е. весь механизм обкатан, но при переносе на андроид возникает загвоздка с получением sucess code)

 

2. if  not (1) тогда, есть ли у кого-то сэмплы или ссылки на реализацию через Java в Delphi, так понимаю, Android.Jni JIntent etc. 

 

post-1622-0-24110300-1442596810.png

post-1622-0-73053700-1442596820.png

post-1622-0-84356000-1442596832.png

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

Как оказалось, можно так:

1. В OAuth2Authenticator в Redirection endpoint : http://localhost

2. Ловить webform.lasttitle, например,  таймером так:

 

procedure TForm2.TimerGetAuthCodeTimer(Sender: TObject);
var
 tokentoedit: string;
begin
  {$IF DEFINED(ANDROID)}
  if Pos('localhost/?code=', webform.LastURL) > 0 then
  begin
    AuthCode := Copy(webform.LastURL, 24, Length(webform.LastURL));
    if (AuthCode <> '') then
    begin
      editactoken.Text:= AuthCode;
      webform.close;
      TimerGetAuthCode.Enabled:=false;
    end;
  end;
  {$ENDIF}
end;
Изменено пользователем Tot999
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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