我几天来一直在努力奋斗,并且感谢任何人都能给予的帮助。电话:和短信:链接在Android上的任何网络浏览器中都可以正常工作。但它们在TWebBrowser中根本不起作用。
我发现这个code for opening links natively,工作正常,但我无法弄清楚如何从TWebBrowser中激活一个函数。有一些仅涉及Windows的解决方案涉及类型库,但似乎没有任何东西可以在Android上运行。
有没有办法在Delphi XE5 Firemonkey移动应用程序中通过TWebBrowser中的网页调用本机函数?或者,有没有办法在TWebBrowser中实际使用Tel和SMS链接?
答案 0 :(得分:1)
如果有人想知道这一点,正如我的问题所述,Android上的XE5上的TWebbrowser无法打开您在webview应用程序中找到的一些最有用的链接 - 即SMS,Tel或Mailto链接。< / p>
我通过重写FMX.Webbrowser.Android中的shouldOverrideUrlLoading函数解决了这个问题。要使用修改后的单元,请将FMX.Webbrowser.Android.pas复制到项目目录,然后将其添加到项目中。然后更改以下原始功能:
function TAndroidWebBrowserService.TWebBrowserListener.shouldOverrideUrlLoading(
P1: JWebView; P2: JString): Boolean;
begin
Result := False;
end;
到
function TAndroidWebBrowserService.TWebBrowserListener.shouldOverrideUrlLoading(
P1: JWebView; P2: JString): Boolean;
var
oUrl,lURL:string;
intent:jintent;
begin
oUrl:=jstringtostring(p2);
lUrl:=lowercase(oURL);
if ((pos('sms:',lUrl)>0) or (pos('tel:',lUrl)>0) or (pos('mailto:',lUrl)>0)) then
begin
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
TJnet_Uri.JavaClass.parse(StringToJString(oURL)));
try
SharedActivity.startActivity(Intent);
p1.stopLoading;
exit(true);
except
on e: Exception do
begin
exit(false);
end;
end;
exit(true);
end;
Result := False;
end;
就是这样。 FMX.Webbrowser.Android的默认位置是C:\ Program Files(x86)\ Embarcadero \ RAD Studio \ 12.0 \ source \ fmx
答案 1 :(得分:0)
我通过使用事件TWebBrowser(FMX)解决了这个问题 onShouldStartLoadWithRequest 和 onDidFailLoadWithError
procedure TForm9.WebBrowser1DidFailLoadWithError(ASender: TObject);
begin
if (BackByError) then
begin
ProccessURL;
Timer2.Enabled := True;
end;
end;
procedure TForm9.WebBrowser1ShouldStartLoadWithRequest(ASender:
TObject;
const URL: string);
var
IPos1, IPos2 : Integer;
aURL : String;
begin
aURL := URL;
IPos1 := Pos('tel:', aURL);
IPos2 := Pos('mailto:', aURL);
BackByError := (IPos1 > 0) or (IPos2 > 0);
if (BackByError) then
URLError := aURL;
end;
procedure TForm9.ProccessURL;
var
i : JIntent;
Uri : JNet_Uri;
begin
Uri := TJnet_Uri.JavaClass.parse(stringtojstring(URLError));
i := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);
try
SharedActivity.startActivity(i);
except
on e: Exception do
begin
ShowMessage('Error: ' + e.Message);
end;
end;
end;
procedure TForm9.Timer2Timer(Sender: TObject);
begin
if (BackByError) and (WebBrowser1.CanGoBack) then
begin
BackByError := False;
WebBrowser1.GoBack;
Timer2.Enabled := False;
end;
end;