delphi 关于webbrowser,android端返回值问题

webbrowser 在android执行js没有返回值

WebBrowser1.EvaluateJavaScript(jsFunc);

//Fix By Flying Wang and 爱吃猪头肉
//procedure TCustomWebBrowser.EvaluateJavaScript(const JavaScript: string);
function TCustomWebBrowser.EvaluateJavaScript(const JavaScript: string): string;
begin
  Result := '';
  if FWeb <> nil then
    Result := FWeb.EvaluateJavaScript(JavaScript);
//    if Result = 'null' then
//      Result := '';
//    if (Result.Length  > 1) and (Result.IndexOf('"') = 0) and
//      (Result.SubString(Result.Length - 1, 1) = '"') then
//    begin
//      Result := Result.SubString(1, Result.Length - 2);
//    end;
end; 

返回值为空。

使用回掉来解决,摘出几行关键代码。

在unit FMX.WebBrowser.Android;

interface
uses FMX.WebBrowser,System.Messaging  ;
{$SCOPEDENUMS ON}
{$IFDEF ANDROID}
Type
   TJSResultMessage = class(TMessage)
      private
        FText : string ;
      public
        constructor Create(AText : string);
        property Text : string read FText ;
    end;

   TJavaScriptCallback = procedure(const AResult : string) of Object ;
   procedure RegisterJSCallBack(const AWebControl: TCustomWebBrowser;const AJavaScript: TJavaScriptCallBack);

......

      TJSResultCallBack = class(TJavaLocal,JValueCallback)
        private
          OnJSResult : TJavaScriptCallback ;
        public
          procedure onReceiveValue(value: JObject); cdecl;
      end;


  private
    FJSCallbackResult : string ;
    FJSResult : TJSResultCallBack ;

.......

 Function   GetJSResult : string ;

Procedure DO_EvaluateJavaScript(const AResult : string );

......

property JSCallBackResult : string read GetJSResult ;

......

procedure TAndroidWebBrowserService.InitUIThread;
begin

 //原代码
  FJWebBrowser := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity);
  FJWebBrowser.getSettings.setJavaScriptEnabled(True);
  FListener := TWebBrowserListener.Create(Self);
  FJWebBrowser.SetWebViewListener(FListener);
  FJNativeLayout := TJNativeLayout.JavaClass.init(TAndroidHelper.Activity,
    MainActivity.getWindow.getDecorView.getWindowToken);
  FJNativeLayout.setPosition(100,100);
  FJNativeLayout.setSize(300,300);
  FJNativeLayout.setControl(FJWebBrowser);
  FFocusChangeListener := TFocusChangeListener.Create(Self);
  FJNativeLayout.setOnFocusChangeListener(FFocusChangeListener);
  FJWebBrowser.getSettings.setBuiltInZoomControls(True);
  FJWebBrowser.getSettings.setDisplayZoomControls(False);

//新增

  FJSResult := TJSResultCallBack.Create ;//   
  FJSResult.OnJSResult := DO_EvaluateJavaScript;//
end;

Procedure TAndroidWebBrowserService.DO_EvaluateJavaScript(const AResult : string );
begin
  FJSCallbackResult := AResult ;
  TMessageManager.DefaultManager.SendMessage(self,TJSResultMessage.Create(AResult));
end;

.....

function TAndroidWebBrowserService.EvaluateJavaScript(const JavaScript: string): string;//需要修改
begin
  //if not TOSVersion.Check(4,4) then
  //begin
  //  LoadURLInUIThread('javascript:' + JavaScript);
  //end;
  {else
  begin
    AJCB := TJValueCallback.Create;
    try
      AJCB.StrResult := '';
      CallInUIThread(procedure begin
        FJWebBrowser.EvaluateJavaScript(StringToJString(JavaScript), AJCB);
      end);
      AJCB.Done.WaitFor(INFINITE);
      Result := AJCB.StrResult;
    finally
      FreeAndNil(AJCB);
    end;
  end;  }
   CallInUIThreadAndWaitFinishing(procedure
    begin
      FJWebBrowser.evaluateJavascript(StringToJString(JavaScript), FJSResult);
    end);

    //LoadURLInUIThread('javascript:' + JavaScript);
    UpdateContentFromControl;
end;

......

Function   TAndroidWebBrowserService.GetJSResult : string ;
begin
  result := FJSCallbackResult;
end;

.......

type
  TDRCustomWebBrowser = class(TControl)
  private
    FWeb: ICustomBrowser;
  end;
procedure RegisterJSCallBack(const AWebControl: TCustomWebBrowser;const AJavaScript: TJavaScriptCallBack);
begin
  with TDRCustomWebBrowser(AWebControl).FWeb as TAndroidWebBrowserService do
  begin
    FJSResult.OnJSResult := AJavaScript ;
  end;
end;
constructor TJSResultMessage.Create(AText: string) ;
begin
  FText := AText ;
end;
procedure TAndroidWebBrowserService.TJSResultCallBack.onReceiveValue(value: JObject);
begin
  if Assigned(OnJSResult) and (value<>nil) then
  begin
    TThread.Queue(nil, procedure begin
      OnJSResult(JStringToString(value.toString));
    end);
  end;
end;

.......

用属性返回。

使用的时候:
      //返回值,异步包同步。
          ASYNCStart(
          procedure
          begin
          WbOther.EvaluateJavaScript('WXReturnUploadImage('''+'true'+''')');
           //timer4.Enabled := true;
               SYNCStart(
                procedure
                begin
                {$IFDEF ANDROID}
                 result:=WbOther.ReturnJSResult;//  返回值
                {$ENDIF}
                end);
          end);

。。。。。。

有个小问题,返回的字符串字符集,不知道是UTF16还是UTF8。放入stringlist里面,无法识别分割符号比如';'和',';只好用数组TArray<string>。

 

posted @ 2017-02-15 13:38  fidorido  阅读(1828)  评论(0)    收藏  举报