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>。

浙公网安备 33010602011771号